实现Oracle游标的动态形式讲解

在开发过程的中,我们经常要用到Oracle游标来进行相关的统计(不用临时表)并且返回其统计结果,但是游标的后面SQL语句往往是动态的,例如select * from tablename where ?order ?."?"代表条件,这样该如何处理呢?

在同事的帮助下我实践了一下。总结出来。

假设tablename表中有field如下:

 
 
 
  1. field1 varchar2(50)   
  2. field2 Varchar2(50)   
  3. field3 Varchar(50)   
  4. field4 varchar2(50)   
  5. field5 varchar2(20)   
  6. field6 float,   
  7. field7 float   

 

1.定义游标

 
 
 
  1. create or replace package RefCursor is   
  2. -- Author : Ricky   
  3. -- Created : 2003-9-1 14:08:45   
  4. -- Purpose :   
  5. -- Public type declarations   
  6. type t_RefCursor is ref cursor;   
  7. end RefCursor; 

2.创建类型

创建的类型与tablename中表的fields一致,当然也要看你实际是否要统计所有的fields.

 
 
 
  1. create or replace type TableType as object   
  2.  (   
  3. -- Author : Ricky   
  4. -- Created : 2003-8-25 9:12:08   
  5. -- Purpose :   
  6. -- Attributes   
  7. field1 varchar2(50),   
  8. field2 Varchar2(50),   
  9. field3 Varchar(50),   
  10. field4 varchar2(50),   
  11. field5 varchar2(20),   
  12. field6 float,   
  13. field7 float   
  14.  );  

3.创建表类型

 
 
 
  1. create or replace type TableTypeList as table of TableType;  

4.在存储过程或者函数中使用,下面在函数中使用(存储过程中不能用return一个表结构,要用到临时表)

 
 
 
  1. CREATE OR REPLACE FUNCTION "TEST" (   
  2. return TableTypeList pipelined as   
  3. begin   
  4. v_Cur RefCursor.t_Refcursor;   
  5. v_SQLStatement string(10000);   
  6. v_Table tablename%rowtype;   
  7. tmp1 tablename.field1%Type;   
  8. tmp2 tablename.field2%Type;   
  9. tmp3 tablename.field3%Type;   
  10. tmp4 tablename.field4%Type;   
  11. tmp5 tablename.field5%Type;   
  12. tmp6 tablename.field6%Type;   
  13. tmp7 tablename.field6%Type;   
  14. v_SQLStatement := 'Select * From tablename where field1='1' order by field1';   
  15. open v_Cur for v_SQLStatement;   
  16. loop   

这里是循环过程
 

 
 
 
  1. fetch v_Cur into v_Comm;   
  2. exit when v_CommCur%notfound;  

这里是你要处理的统计过程,中间的过程我没有做统计,各位在实践中按需要自己添加。
 

 
 
 
  1. field1 = v_Cur.field1;   
  2. field2 = v_Cur.field2;   
  3. field3 = v_Cur.field3;   
  4. field4 = v_Cur.field4;   
  5. field5 = v_Cur.field5;   
  6. field6 = v_Cur.field6;   
  7. field7 = v_Cur.field7;   
  8. v_Table = TableType(field1,   
  9. field2,   
  10. field3,   
  11. field4,   
  12. field5,   
  13. field6,   
  14. field7)   
  15. pipe row(v_Table);   
  16. end loop   
  17. end;  

以上的相关内容就是对Oracle游标动态形式的实现的介绍,望你能有所收获。

分享文章:实现Oracle游标的动态形式讲解
网址分享:http://www.mswzjz.cn/qtweb/news34/389884.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能