首页 > 数据库 > Oracle > 正文

Oracle下的动态游标实现(总结)

2024-08-29 13:31:42
字体:
来源:转载
供稿:网友

不少朋友在开发过程中,要使用到游标进行统计(不用临时表)并返回统计结果,但游标后面的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;   
 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表