说明:
为了让CYQ.Data 框架支持Oracle,这几天对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;
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;
ResultCursor MyPackage.MyCursor;
ResultCount int;
begin
MyPackage.SelectBase(1,2,'USERS','id>1 order by id',ResultCount,ResultCursor);
end;
说明:
为写这段存储过程历经了半天,需要看语法,又要调试,最后采用步步注释法才一条语句一条语句的写到最后。
测试调试也弄了半天,要定义游标传进去才行。
测试调试也弄了半天,要定义游标传进去才行。
继续说明:

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里没有。
存储过程的代码里面有几个小问题,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:数据库表/视图的字段结构查询:

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
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'; --所有表
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'; --所有表
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。 |
个人微信公众号![]() |
Donation(扫码支持作者):支付宝:![]() |
Donation(扫码支持作者):微信:![]() |
![]() |
分类:
DataBase(Oracle)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)