在开发过程的中,我们经常要用到Oracle游标来进行相关的统计(不用临时表)并且返回其统计结果,但是游标的后面SQL语句往往是动态的,例如select * from tablename where ?order ?."?"代表条件,这样该如何处理呢?
在同事的帮助下我实践了一下。总结出来。
假设tablename表中有field如下:
- field1 varchar2(50)
- field2 Varchar2(50)
- field3 Varchar(50)
- field4 varchar2(50)
- field5 varchar2(20)
- field6 float,
- field7 float
1.定义游标
- create or replace package RefCursor is
- -- Author : Ricky
- -- Created : 2003-9-1 14:08:45
- -- Purpose :
- -- Public type declarations
- type t_RefCursor is ref cursor;
- end RefCursor;
2.创建类型
创建的类型与tablename中表的fields一致,当然也要看你实际是否要统计所有的fields.
- create or replace type TableType as object
- (
- -- Author : Ricky
- -- Created : 2003-8-25 9:12:08
- -- Purpose :
- -- Attributes
- field1 varchar2(50),
- field2 Varchar2(50),
- field3 Varchar(50),
- field4 varchar2(50),
- field5 varchar2(20),
- field6 float,
- field7 float
- );
3.创建表类型
- create or replace type TableTypeList as table of TableType;
4.在存储过程或者函数中使用,下面在函数中使用(存储过程中不能用return一个表结构,要用到临时表)
- CREATE OR REPLACE FUNCTION "TEST" (
- return TableTypeList pipelined as
- begin
- v_Cur RefCursor.t_Refcursor;
- v_SQLStatement string(10000);
- v_Table tablename%rowtype;
- tmp1 tablename.field1%Type;
- tmp2 tablename.field2%Type;
- tmp3 tablename.field3%Type;
- tmp4 tablename.field4%Type;
- tmp5 tablename.field5%Type;
- tmp6 tablename.field6%Type;
- tmp7 tablename.field6%Type;
- v_SQLStatement := 'Select * From tablename where field1='1' order by field1';
- open v_Cur for v_SQLStatement;
- loop
这里是循环过程
- fetch v_Cur into v_Comm;
- exit when v_CommCur%notfound;
这里是你要处理的统计过程,中间的过程我没有做统计,各位在实践中按需要自己添加。
- field1 = v_Cur.field1;
- field2 = v_Cur.field2;
- field3 = v_Cur.field3;
- field4 = v_Cur.field4;
- field5 = v_Cur.field5;
- field6 = v_Cur.field6;
- field7 = v_Cur.field7;
- v_Table = TableType(field1,
- field2,
- field3,
- field4,
- field5,
- field6,
- field7)
- pipe row(v_Table);
- end loop
- end;
以上的相关内容就是对Oracle游标动态形式的实现的介绍,望你能有所收获。
分享文章:实现Oracle游标的动态形式讲解
网址分享:http://www.mswzjz.cn/qtweb/news34/389884.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能