实现Oracle游标的动态形式讲解

数据库 Oracle
以下的文章主要是对实现Oracle游标的动态形式的正确讲解,我们以假设实例的方式来讲述其实际的操作步骤,以下就是文章的具体操作内容。

在开发过程的中,我们经常要用到Oracle游标来进行相关的统计(不用临时表)并且返回其统计结果,但是游标的后面SQL语句往往是动态的,例如select * from tablename where ?order ?."?"代表条件,这样该如何处理呢?

在同事的帮助下我实践了一下。总结出来。

假设tablename表中有field如下:

 

  1. field1 varchar2(50)   
  2. field2 Varchar2(50)   
  3. field3 Varchar(50)   
  4. field4 varchar2(50)   
  5. field5 varchar2(20)   
  6. field6 float,   
  7. field7 float   

 

1.定义游标

 

  1. create or replace package RefCursor is   
  2. -- Author : Ricky   
  3. -- Created 2003-9-1 14:08:45   
  4. -- Purpose :   
  5. -- Public type declarations   
  6. type t_RefCursor is ref cursor;   
  7. end RefCursor; 

2.创建类型

创建的类型与tablename中表的fields一致,当然也要看你实际是否要统计所有的fields.

 

  1. create or replace type TableType as object   
  2.  (   
  3. -- Author : Ricky   
  4. -- Created : 2003-8-25 9:12:08   
  5. -- Purpose :   
  6. -- Attributes   
  7. field1 varchar2(50),   
  8. field2 Varchar2(50),   
  9. field3 Varchar(50),   
  10. field4 varchar2(50),   
  11. field5 varchar2(20),   
  12. field6 float,   
  13. field7 float   
  14.  );  

3.创建表类型

 

  1. create or replace type TableTypeList as table of TableType;  

4.在存储过程或者函数中使用,下面在函数中使用(存储过程中不能用return一个表结构,要用到临时表)

  1. CREATE OR REPLACE FUNCTION "TEST" (   
  2. return TableTypeList pipelined as   
  3. begin   
  4. v_Cur RefCursor.t_Refcursor;   
  5. v_SQLStatement string(10000);   
  6. v_Table tablename%rowtype;   
  7. tmp1 tablename.field1%Type;   
  8. tmp2 tablename.field2%Type;   
  9. tmp3 tablename.field3%Type;   
  10. tmp4 tablename.field4%Type;   
  11. tmp5 tablename.field5%Type;   
  12. tmp6 tablename.field6%Type;   
  13. tmp7 tablename.field6%Type;   
  14. v_SQLStatement := 'Select * From tablename where field1='1' order by field1';   
  15. open v_Cur for v_SQLStatement;   
  16. loop   

这里是循环过程
 

  1. fetch v_Cur into v_Comm;   
  2. exit when v_CommCur%notfound;  

这里是你要处理的统计过程,中间的过程我没有做统计,各位在实践中按需要自己添加。
 

  1. field1 = v_Cur.field1;   
  2. field2 = v_Cur.field2;   
  3. field3 = v_Cur.field3;   
  4. field4 = v_Cur.field4;   
  5. field5 = v_Cur.field5;   
  6. field6 = v_Cur.field6;   
  7. field7 = v_Cur.field7;   
  8. v_Table = TableType(field1,   
  9. field2,   
  10. field3,   
  11. field4,   
  12. field5,   
  13. field6,   
  14. field7)   
  15. pipe row(v_Table);   
  16. end loop   
  17. end;  

以上的相关内容就是对Oracle游标动态形式的实现的介绍,望你能有所收获。

【编辑推荐】

  1. 对Oracle 11g中的XML正确理解
  2. win2000企业版下正确卸载Oracle 9i
  3. Oracle安全策略在MIS系统实例中的体现
  4. 安装Oracle 10g 在redhat linux 的正确方案
  5. Oracle 10G数据库中软硬件环境有哪些要求?
责任编辑:佚名 来源: 赛迪网
相关推荐

2010-07-01 14:36:34

SQL Server动

2010-04-21 15:02:50

Oracle使用游标

2010-04-21 15:10:35

Oracle游标

2010-05-07 12:07:08

Oracle 多层游标

2010-09-01 15:09:41

DB2动态游标

2010-04-21 15:52:45

Oracle游标

2010-09-01 15:15:20

DB2动态游标

2011-07-29 10:36:43

游标Oracle数据库

2010-05-26 16:41:09

MySQL 游标

2022-05-11 15:06:02

MySQL游标SQL

2010-09-08 09:11:42

SQL游标语法

2010-05-31 17:06:35

MySQL游标

2010-09-10 16:20:10

SQL函数

2010-08-05 14:24:37

DB2存储过程

2010-11-16 15:40:21

oracle游标

2010-07-14 15:32:28

SQL Server

2010-11-16 15:11:52

Oracle隐式游标

2010-11-16 15:23:28

Oracle游标

2010-10-09 16:41:54

MYSQL存储过程

2010-07-26 10:59:59

SQL Server游
点赞
收藏

51CTO技术栈公众号