WEB开发网
开发学院数据库Oracle Oracle下的动态游标实现 阅读

Oracle下的动态游标实现

 2008-01-28 12:40:54 来源:WEB开发网   
核心提示:不少朋友在开发过程中,要使用到游标进行统计(不用临时表)并返回统计结果,Oracle下的动态游标实现,但游标后面的SQL却是动态的,如select * from tablename where ? order ?."?"代表条件,下面在函数中使用(存储过程中不能用return一个表结构,要用到临时表

不少朋友在开发过程中,要使用到游标进行统计(不用临时表)并返回统计结果,但游标后面的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;

Tags:Oracle 动态 游标

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接