加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程

发布时间:2020-12-12 15:41:23 所属栏目:百科 来源:网络整理
导读:说明: 为了让CYQ.Data框架支持Oracle,这几天对Oracle进行了基本探索,并把中间遇到的问题轻轻的记录了下来,与大伙共享。 总共有三篇: 1: 初折腾Oracle问题小记 2: 初折腾Oracle问题小记二 3:就是本篇了:折腾Oracle问题小菜记(三) 本篇又有新突破,再记
说明: 为了让CYQ.Data框架支持Oracle,这几天对Oracle进行了基本探索,并把中间遇到的问题轻轻的记录了下来,与大伙共享。

总共有三篇:

1:初折腾Oracle问题小记

2:初折腾Oracle问题小记二

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

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

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

create or replace packageMyPackage as
typeMyCursor
is ref cursor ;
procedure SelectBase(pageIndex int ,pageSize int ,tableName varchar2 ,whereStr varchar2 ,
resultCountout
int ,resultCursoroutMyCursor);
end MyPackage;

create or replace packageBodyMyPackage is
procedure SelectBase(pageIndex int ,resultCursoroutMyCursor)
is
-- 定义变量
newtableName varchar2 ( 4000 );
rowStart
int ;
rowEnd
int ;
mySql
varchar2 ( 8000 );
whereOnly
varchar2 ( 8000 );
OrderOnly
varchar2 ( 400 );
begin
newtableName:
= tableName;
mySql:
= ' selectcount(*)from ' || tableName;


if whereStr is not null and length(whereStr) > 0
then
rowStart:
= instr(whereStr, ' orderby ' );
if rowStart > 0
then
whereOnly:
= substr(whereStr, 1 ,rowStart - 1 ); -- 取得条件
OrderOnly: = substr(whereStr,rowStart,length(whereStr) - rowStart + 1 ); -- 取得排序方式(orderby字段方式)
else
whereOnly:
= whereStr;
OrderOnly:
= '' ;
end if ;
whereOnly:
= ' where ' || whereOnly;
mySql:
= mySql || whereOnly;

end if ;
execute immediatemySql 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(selectt.*,RowNumasrnfrom(select*from ' || newtableName || whereOnly || OrderOnly || ' )t)wherernbetween ' || rowStart || ' and ' || rowEnd;

end if ;
open ResultCursor for mySql;
-- dbms_output.put_line('SQL=>'||mySql);
end SelectBase;
end MyPackage;

执行测试语句:

declare
ResultCursorMyPackage.MyCursor;
ResultCount
int ;
begin
MyPackage.SelectBase(
1 , 2 , ' USERS ' , ' id>1orderbyid ' ,ResultCount,ResultCursor);
end ;

说明:

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

继续说明:

Oracle里的存储过程的可以有Package,等于一个名称空间了。

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

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

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

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

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

5:if...then...elseendif,mssql里为ifbeginend

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

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

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:查询所有表/视图/存储过程

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 ' ; -- 所有表

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读