数据库对象 游标型变量

定义 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 模式 . 也就是说 , 子程序可以将一个打开的游标变量传递给调用者 .

 

//---------------------------------------------------------------------------------------------------------

给你一个完整的例子:  
  DECLARE  
        TYPE   EmpCurTyp   IS   REF   CURSOR;  
        emp_cv       EmpCurTyp;  
        emp_rec     emp%ROWTYPE;  
        sql_stmt   VARCHAR2(200);  
        my_job       VARCHAR2(15)   :=   'CLERK';  
  BEGIN  
        sql_stmt   :=   'SELECT   *   FROM   emp   WHERE   job   =   :j';  
        OPEN   emp_cv   FOR   sql_stmt   USING   my_job;  
        LOOP  
              FETCH   emp_cv   INTO   emp_rec;  
              EXIT   WHEN   emp_cv%NOTFOUND;  
              --   process   record  
        END   LOOP;  
        CLOSE   emp_cv;  
  END;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值