折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

说明:

为了让CYQ.Data 框架支持Oracle,这几天对Oracle进行了基本探索,并把中间遇到的问题轻轻的记录了下来,与大伙共享。

 

 

总共有三篇:

1:初折腾Oracle问题小记

2:初折腾Oracle问题小记二

3:就是本篇了:折腾Oracle问题小菜记(三)

 

本篇又有新突破,再记录一下:

 

1:自己写了一条分页存储过程,也是CYQ.Data默认产生的存储过程:

 

复制代码
create   or   replace  package MyPackage  as  
type MyCursor 
is  ref  cursor ;
procedure  SelectBase(pageIndex  int ,pageSize  int ,tableName  varchar2 ,whereStr  varchar2 ,
  resultCount out 
int , resultCursor out MyCursor);
end  MyPackage;

create   or   replace  package Body MyPackage  is
procedure  SelectBase(pageIndex  int ,pageSize  int ,tableName  varchar2 ,whereStr  varchar2 ,
  resultCount out 
int , resultCursor out MyCursor)
  
is
  
-- 定义变量
  newtableName  varchar2 ( 4000 );
  rowStart  
int ;
  rowEnd    
int ;
  mySql 
varchar2 ( 8000 );
  whereOnly 
varchar2 ( 8000 );
  OrderOnly 
varchar2 ( 400 );
  
begin
    newtableName:
= tableName;
    mySql:
= ' select count(*) from  ' || tableName;

    
    
if  whereStr  is   not   null   and  length(whereStr) > 0
      
then
          rowStart:
= instr(whereStr, ' order by ' );
         
if  rowStart > 0  
          
then
            whereOnly:
= substr(whereStr,  1 ,rowStart - 1 );     -- 取得条件 
            OrderOnly: = substr(whereStr,rowStart, length(whereStr) - rowStart + 1 );     -- 取得排序方式(order by 字段 方式) 
           else
            whereOnly:
= whereStr;
            OrderOnly:
= '' ;
            
end   if ;
           whereOnly:
= '  where  ' ||  whereOnly;
           mySql:
= mySql || whereOnly;
         
     
end   if ;
     
execute  immediate mySql  into  resultCount;
       
--  dbms_output.put_line('查询总条数SQL=>'||whereStr||'--'||mySql||resultCount); 
     -- 执行查询,查询总条数 
           


            
-- 不分页查所有
          
        
if  pageIndex = 0   and  pageSize = 0     
        
then  
        mySql:
= ' select * from  ' || tableName || whereOnly || OrderOnly;
       
else
-- 计算起始和结束索引

        rowStart:
= (pageIndex - 1 ) * pageSize + 1
        rowEnd:
= rowStart + pageSize - 1 ;
        mySql:
= ' select * from (select t.*,RowNum as rn from (select * from  ' || newtableName || whereOnly || OrderOnly || ' ) t) where rn between  ' || rowStart || '  and  ' || rowEnd;
      
        
end   if ;
    
open  ResultCursor  for  mySql;
   
-- dbms_output.put_line('SQL=>'||mySql); 
     end  SelectBase;
  
end  MyPackage;
复制代码

 

执行测试语句:

复制代码
  declare
  ResultCursor MyPackage.MyCursor;
  ResultCount 
int ;
  
begin
  MyPackage.SelectBase(
1 , 2 , ' USERS ' , ' id>1 order by id ' ,ResultCount,ResultCursor);
  
end ;
复制代码

 

说明:

为写这段存储过程历经了半天,需要看语法,又要调试,最后采用步步注释法才一条语句一条语句的写到最后。
测试调试也弄了半天,要定义游标传进去才行。

 

继续说明:

复制代码
ExpandedBlockStart.gif
Oracle里的存储过程的可以有Package,等于一个名称空间了。

存储过程的代码里面有几个小问题,oracle->比较->mssql:

1:|| 为链接符号即+号

2:instr 函数和sql的函数charindex函数一样,只是里面的头两个参数的顺序要反过来。

3:substr函数和sql的函数substring函数一样。

4:length函数和sql的函数len函数一样。

5:if ...then...else end if,   mssql里为 if begin end

6:“;"号一行语句一个,mssql里没有。
复制代码

 

 

 

 

2:数据库表/视图的字段结构查询:

复制代码
ExpandedBlockStart.gif
select  COLUMN_NAME  as  ColumnName,
Data_length
* 2   as  MaxSize,
case  NULLABLE  when   ' Y '   then   1   else   0   end   as  IsNullable,
0   as  ReadOnly,
DATA_TYPE 
as  SqlType
from  USER_TAB_COLS  where  TABLE_NAME = upper (:TableName)  order   by  COLUMN_ID
复制代码

 

3:存储过程参数放在另一个表,独立查询:

select  argument_Name  as  ColumnName, - 1   as  MaxSize, 0   as  IsNullable, 0   as  ReadOnly, ' int '   as  SqlType  from  user_arguments  where   object_name = upper (:TableName)

 

4:查询所有表/视图/存储过程

ExpandedBlockStart.gif
Select   object_name   From  user_objects  Where  object_type = ' TRIGGER ' -- 所有触发器
Select   object_name   From  user_objects  Where  object_type = ' PROCEDURE ' -- 所有存储过程
Select   object_name   From  user_objects  Where  object_type = ' VIEW ' -- 所有视图
Select   object_name   From  user_objects  Where  object_type = ' TABLE ' -- 所有表

 

 

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/09/28/1837692.html

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 SQL Oracle
Oracle系列十五:存储过程
Oracle系列十五:存储过程
|
2月前
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
32 2
|
2月前
|
SQL Oracle 关系型数据库
Oracle查询优化-查询只包含数字或字母的数据
【2月更文挑战第4天】【2月更文挑战第10篇】查询只包含数字或字母的数据
90 1
|
3月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
38 0
|
1月前
|
SQL Oracle 关系型数据库
Oracle系列之八:SQL查询
Oracle系列之八:SQL查询
|
2月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
2月前
|
Oracle 关系型数据库
Oracle 递归查询
Oracle 递归查询
10 0
|
3月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
35 0
|
23天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
1月前
|
存储 关系型数据库 MySQL
Mysql基础第二十六天,使用存储过程
Mysql基础第二十六天,使用存储过程
28 0
Mysql基础第二十六天,使用存储过程

推荐镜像

更多