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;

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3