DECLARE cursor_name CURSOR [WITH RETURN] FOR sql_statement;
复制
组成部分
游标的组成通常可分为四个部分,分别为声明游标,打开游标,取数据,以及关闭游标,语法如下:
基本用法
使用示例
!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 | +-----------------------------+
复制
文档反馈