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

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

在开发过程的中,我们经常要用到Oracle游标来进行相关的统计(不用临时表)并且返回其统计结果,但是游标的后面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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

 

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; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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   
 );  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

3.创建表类型

 

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

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   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

这里是循环过程
 

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

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

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;  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

以上的相关内容就是对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:10:35

Oracle游标

2010-04-21 15:02:50

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数据库

2022-05-11 15:06:02

MySQL游标SQL

2010-05-26 16:41:09

MySQL 游标

2010-09-08 09:11:42

SQL游标语法

2010-09-10 16:20:10

SQL函数

2010-05-31 17:06:35

MySQL游标

2010-08-05 14:24:37

DB2存储过程

2010-07-14 15:32:28

SQL Server

2010-11-16 15:11:52

Oracle隐式游标

2010-11-16 15:40:21

oracle游标

2010-11-16 15:23:28

Oracle游标

2010-10-09 16:41:54

MYSQL存储过程

2010-07-26 10:59:59

SQL Server游
点赞
收藏

51CTO技术栈公众号