联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
8.15.11 游标 <a id="procedure-cursor"></a>
更新时间:11/15/2023, 11:13:44 AM

组成部分

游标的组成通常可分为四个部分,分别为声明游标,打开游标,取数据,以及关闭游标,语法如下:

  • 在声明部分声明游标:

    DECLARE cursor_name CURSOR [WITH RETURN] FOR  sql_statement;
    复制
  • 打开游标:

    OPEN cursor_name;
    复制
  • 取数据:

    FETCH cursor_name INTO Variable;
    复制
  • 关闭游标:

    CLOSE cursor_name;
    复制
基本用法

使用示例

!set plsqlUseSlash true
BEGIN
  -- 声明一个名为 c1 的游标,用来查找表 transactions 中价格为 12.13 的交易时间。
  DECLARE c1 CURSOR FOR SELECT trans_time FROM transactions WHERE price=12.13;
  -- 声明一个名为 v_time 的变量,数据类型为字符串。
  DECLARE v_time STRING;
  -- 打开游标。
  OPEN c1;
  -- 将游标查询到的结果放进变量 v_time 里。
  FETCH c1 INTO v_time;
  -- 关闭游标。
  CLOSE c1;
  -- 打印出变量 v_time 的值。
  PUT_LINE('the time is:'||v_time);
END;
/
复制

输出结果

+-----------------------------+
|           output            |
+-----------------------------+
| the time is:20140105100520  |
+-----------------------------+
复制
ALLOCATE CURSOR

在调用存储过程时,可以使用 ALLOCATE CURSOR 语句来返回游标.具体的使用方法,将首先通过 ASSOCIATE LOCATOR 语句来声明存储过程的结果集,接着使用 ALLOCATE CURSOR 语句将不同的游标分配给相应的结果集。

语法

  • 声明结果集

    ASSOCIATE RESULT SET LOCATOR  (result_name1, result_name2,...) WITH  PROCEDURE  procedure_name;
    复制
  • 分配游标

    ALLOCATE <cursor-name> CURSOR FOR RESULT SET <locator-variable>;
    复制

使用示例

首先,我们创建名为 pro_1 的存储过程,在过程内声明两个带有返回值的游标。

!set plsqlUseSlash true
-- 创建一个名为pro_1且不带参数的存储过程。
CREATE OR REPLACE PROCEDURE pro_1()
LANGUAGE SQL
-- 存储过程pro_1将返回两个结果集。
DYNAMIC RESULT SETS 2
BEGIN
  -- 声明一个名为c1的游标,用来查询表transactions中价格为12.13的账号。
  DECLARE c1 CURSOR WITH RETURN FOR
      SELECT acc_num FROM transactions WHERE price=12.13;
  -- 打开游标c1。
  OPEN c1;
  BEGIN
     -- 声明一个名为c2的游标,用来查询表transactions中价格为12.13的交易时间。
     DECLARE c2 CURSOR WITH RETURN FOR
       SELECT trans_time FROM transactions WHERE price=12.13;
     OPEN c2;
  END;
END;
/
复制

随后,调用 pro_1() 过程,在过程内分配两个带有返回值的游标

!set plsqlUseSlash true
BEGIN
 -- 声明两个结果集rsl1, rsl2。
 DECLARE rsl1, rsl2 result_set_locator varying;
 DECLARE v1 STRING;
 -- 调用过程pro_1。
 CALL pro_1();

 -- 结果集rsl1, rsl2分别用来存放过程pro_1返回的结果。
 ASSOCIATE RESULT SET LOCATOR (rsl1, rsl2) WITH PROCEDURE pro_1;
 -- 游标c1查询到的结果作为结果集rsl1,游标c2查询到的结果作为结果集rsl2。
 ALLOCATE c1 CURSOR FOR result set rsl1;
 ALLOCATE c2 CURSOR FOR result set rsl2;

 -- 将游标c1查询到的结果放进变量v1里。
 FETCH c1 INTO v1;
 -- 关闭游标c1。
 CLOSE c1;
   -- 打印出变量v1的值,即所查询到的表transactions中的账号。
   PUT_LINE('the acc_num is:'||v1);
 -- 将游标c2查询到的结果放进变量v1里。
 FETCH c2 INTO v1;
 -- 关闭游标c2。
 CLOSE c2;
   -- 打印出变量v2的值,即所查询到的表transactions中的账号。
   PUT_LINE('the time is:'||v1);
END;
/
复制

输出结果

+-----------------------------+
|           output            |
+-----------------------------+
| the acc_num is:6513065      |
| the time is:20140105100520  |
+-----------------------------+
复制