首页 | 互联网 | IT动态 | Cisco | Windows | Linux | Java | .Net | Oracle | 华为 | 存储世界 | 服务器 | 网络设备 | IDC | 安全 | 求职招聘
IT培训 | 数字网校 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 解决方案 | 直播室 | 虚拟考场 | 搜索 | 博客 | 沙龙 | 论坛
中国IT实验室Oracle频道
中国IT教育
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 开发技术 >> 文章正文

详细讲解Oracle数据库中动态游标的实现

文章来源中国IT实验室收集整理 作者佚名 更新时间2008-4-7 保存本文保存本文 推荐给好友推荐给好友 收藏本页收藏本页

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

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题
 ·展现C#世界 C#程序设计专题
 ·Java入门 Tomcat的配置技巧精华专题
 ·Oracle RMAN物理备份技术详解
 ·JAVA开发利器——JBuilder知多少
 ·Hello,web2.0技术进阶专题
 今日更新
 社区讨论
 博客论点
 频道精选
 Oracle频道相关导航