Chinaunix首页 | 论坛 | 博客
  • 博客访问: 650606
  • 博文数量: 789
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 4985
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 09:29
文章分类

全部博文(789)

文章存档

2011年(1)

2008年(788)

我的朋友

分类:

2008-10-28 09:44:01

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

 

【责编:Ken】

--------------------next---------------------

阅读(411) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~