捷凌网安Oracle频道
中国IT教育
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 讨论
 您现在的位置: 捷凌网安 >> Oracle >> 开发技术 >> 正文
详细讲解Oracle数据库中动态游标的实现

作者:佚名 责任编辑:左决 点击数: 更新时间:2008-4-15 5:30:04

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

  • 上一篇文章:

  • 下一篇文章:
  •  
     最进更新
    普通文章如何获得Oracle DBA工作?05-11
    普通文章分别删除数据表记录的方法05-11
    普通文章实例讲解删除表空间时存在的05-11
    普通文章Oracle Wait Event:Data fil05-11
    普通文章重复利用这个外部表的表结构05-11
    普通文章Oracle 9i数据库的用户创建以05-11
    普通文章Oracle数据库应用程序中RAID05-11
    普通文章如何更改监听器设置05-11
    普通文章Oracle中SQL语句执行效率的查05-11
    普通文章掌握数据库链路的建立和使用05-11
     
     推荐文章
    推荐文章研究人员发现攻击Oracle数据04-30
    推荐文章研究人员找到新方法黑掉Orac04-30
    推荐文章数据库产业商业模式大猜想04-30
    推荐文章一种并发控制的精典案例04-30
    推荐文章讲解Oracle在Solaris下的性能04-30
    推荐文章Oracle中为什么会产生回滚与04-30
    推荐文章实例讲解sql_trace和access 04-30
    推荐文章Oracle数据库9i和10g环境下使04-30
    推荐文章Oracle数据库后台进程的具体04-30
    推荐文章Oracle数据库中Undo数据段的04-30
     
     热点文章
    普通文章PB内置Oracle数据库接口的使03-27
    普通文章用最简单的方法记录Oracle语03-27
    推荐文章教你快速掌握Oracle数据库的03-27
    推荐文章详细讲解"Oracle"数据库的“03-27
    普通文章深入讲解Oracle数据库的多栏03-27
    推荐文章教你快速掌握一个简单的Orac03-27
    推荐文章初学者应该如何理解Oracle的03-27
    普通文章怎样将"Oracle"的外部表汉字03-27
    推荐文章解决不同字符集数据库间的数03-27
    普通文章Oracle的window服务启动时并03-27

    | 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 友情链接 | 版权申明 | 网站地图 |

    在线交流 捷凌网安主群:51649627
    Copyright 2007-2008 © 捷凌网安. All rights reserved.
    备案序号:蜀ICP备08001812号