`
kb5706
  • 浏览: 41540 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

动态游标(REF CURSOR)

 
阅读更多
2. 动态游标(REF CURSOR)

首先 , 游标变量和游标是两个不同的概念 . 与游标相似 , 游标变量是指向多行查游标询的结果集的当前行 . 游标是静态的 , 游标变量是动态的 ,. 同时游标变量并不参与与特定的查询绑定 , 所以可以为任何兼容的查询打开游标变量 , 从而提高灵活性 . 而且 , 还可以将新的值赋予游标变量 , 将它作为参数传递给本地和存储过程 . 游标变量针对每个 PL/SQL 用户都是可用的 , 可以在客户端完全使用游标变量 .ORACLE 服务器同样包含 PL/SQL 引擎 , 可以将游标变量在应用和服务器之间进行传递 .

1. 游标变量 : 声明游标实际上是创建一个指针 , 指针具有数据类型 REF X.REF 是 REFERENCE ,X 是表示类对象 . 因此 , 游标变量具有数据类型 REF CURSOR.

注 : 游标总是指向相同的查询工作区 , 游标变量能够指向不同的工作区 , 因此游标和游标变量不能互操作 .

3. 定义 REF CURSOR 类型 , 创建游标变量有两个步骤 :

1) 定义 REF CURSOR 类型

语法格式 :

TYPE ref_type_name

IS

REF CURSOR [RETURN return_type]

说明 :

ref_type_name 是游标变量中使用的类型 ;return_type 必须是一个记录 (record) 或者数据库表中的一行 .(rowtype)

下面定义 一个 REF CURSOR 类型游标

DELARE

TYPE xs_cur

IS

REF CURSOR RETURN xs%ROWTYPE;

注意 :

REF CURSOR 类型既可以是强类型 , 也可以是弱类型 , 区别是强类型有返回类型 , 弱类型没有 . 如下所示

DECLARE

TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;-- 强类型

TYPE mycur IS REF CURSOR;-- 弱类型

2) 声明这种类型的游标变量 : 一旦定义了 REF CURSOR 类型就可以在 PL/SQL 块或子程序中声明这个游标变量 . 如 :

DECARE

TYPE xs_cur REF CURSOR RETURN xs%ROWTYPE;

xscur xs_cur;

当然 , 在 RETURN 子句中也可以定义自定义的 RECORD 类型 , 如 :

DECLARE

TYPE kc_cj IS RECORD

(

kch number (4),

kcm number(10),

cj number(4,2)

);

TYPE kc_cjcur IS REF CURSOR RETURN kc_cj;

此外 , 也可以声明游标变量作为函数和过程的参数 . 例如 :

DECLARE

TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;

PROCEDURE open_xs (xscur IN OUT xs_cur)IS

......................

3. 控制游标变量

使用游标变量时 , 要遵循以下步骤 :OPEN-FETCH-CLOSE

OPEN 语句与多行查询的游标变量相关联 , 它执行查询 , 标志结果集

语法格式 :

OPEN {cursor_variable|:host_cursor_variable }FOR

{

select_statement|dynamic_string[USING bind_argument[,......]]

}

如 :

IF NOT xscur%ISOPEN THEN

OPEN xscur FOR SELECT * FROM xs;

END IF ;

游标变量同样可以使用游标属性 :%FOUND,%ISOPEN,%ROWTYPE

在使用过程中 , 其他的 OPEN 语句可以为不同的查询打开相同的游标变量 . 因此 , 在重新打开之前 , 不要关闭游标变量 . 可以打开游标 , 并作为参数传递给存储过程 . 如 :

CREATE PACKAGE xs_data AS

...

TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;

RROCEDURE open_xs(xscur IN OUT xs_cur);

END xs_data;



CREATE PACKAGE BODY xs_data AS

...

PROCEDURE open_xs(xscur IN OUT xs_cur)

AS

BEGIN

OPEN xscur FOR SELECT * FROM xs;

END open_xs;

END xs_data;

当声明一个游标变量作为打开游标变量子程序的参数时 , 必须定义 IN OUT 模式 . 也就是说 , 子程序可以将一个打开的游标变量传递给调用者
分享到:
评论

相关推荐

    oracle如何合并多个sys_refcursor详解

    在数据开发中,有时你需要合并两个动态游标sys_refcursor。 开发一个存储过程PROC_A,这个过程业务逻辑相当复杂,代码篇幅较长。一段时间后要开发一个PROC_B,要用PROC_A同样的逻辑,而且在这个过程中,还要循环调用...

    PL_SQL模块学习之十、游标

    文章目录游标1.1 显式游标1.1.1 创建游标1.1.2 打开游标1.1.3 获取数据1.1.4 关闭游标1.1.5 使用实例1.2 隐式游标1.2.2 游标属性1.3 ...详情参考oracle中cursor与refcursor及sys_refcursor的区别 1.1 显式游标 1.1.1 创

    OracleDataAccess游标参数.rar

    Oracle.DataAccess.dll ... Oracle.ManagedDataAccess.dll ... 两者均可定义Oracle存过游标参数 ...OracleParameter ps_listcsr = new OracleParameter();...ps_listcsr.OracleDbType = OracleDbType.RefCursor;

    Oracle 中 table 函数的应用浅析

    利用游标 REF CURSOR 可将数据集(多行记录)传递到PL/SQL函数: SELECT * FROM TABLE (myfunction (CURSOR (SELECT * FROM mytab))); 2. 利用两个实体化视图(或表)作为样板数据 CREATE MATERIALIZED VIEW ...

    Oracle存储过程返回游标实例详解

    有俩种方法: 一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为 in out 或out (1)声明个人系统游标.(推荐) 代码如下: create or replace p_temp_procedure ( cur_arg out sys_refcursor;...

    在Oracle PL/SQL中游标声明中表名动态变化的方法

    REF CURSOR 是一种可以动态变化的游标类型,可以在运行时指定游标的表名。例如: ```sql DECLARE TYPE emp_cur IS REF CURSOR; cur emp_cur; v_tablename VARCHAR2(30) := 'EMPLOYEES'; BEGIN OPEN cur FOR '...

    oracle 在一个存储过程中调用另一个返回游标的存储过程

    第一种情况是返回的游标是某个具体的表或视图的数据,如: SQL-Code: 代码如下: CREATE OR REPLACE PROCEDURE P_TESTA ( PRESULT OUT SYS_REFCURSOR ) AS BEGIN OPEN PRESULT FOR SELECT * FROM USERS; END P_TESTA;...

    分页存储过程的实现及调用

    type type_cur is ref cursor; --定义游标变量用于返回记录集 procedure Pagination(Pindex in number, --要显示的页数索引,从0开始 Psql in varchar2, --产生分页数据的查询语句 Psize in number, --每页...

    PL/SQL 基础.doc

    3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE [变量名] [表名.字段名] [%TYPE] 表示变量具有与数据库的表中某一字段相同的类型 例:v_FirstName s_emp.first_name%TYPE;...

    增量光标:此功能允许您使用Matlab的内置数据光标来拥有增量光标。-matlab开发

    参考光标的 dX、dY 和 dZ 将为 0,而不是字符串“Ref Cursor”。 这不会影响功能。 这只是一个轻微的烦恼。 增量游标仍将显示正确的值。 这是 Matlab 在调用数据光标“UpdateFcn”时未传入数据光标 obj 的问题。

    Oracle 查询存储过程做横向报表的方法

    CREATE OR REPLACE PACKAGE CHEN_TEST_PACKGE IStype cursor_type is ref cursor;    /************************************************************************************/ /* 功能说明:查询某种公告报表...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    Type DynamicCursor is ref Cursor; --动态游标 --Purpose : 获得汉字拼音编码 Type ut_PYIndex_191_List is Varray( 191 ) OF Number; Type ut_PYIndex_List is Varray( 10 ) OF ut_PYIndex_191_...

Global site tag (gtag.js) - Google Analytics