下面描述使用游标变量循环获取记录集的每行记录方法。
在声明部分
定义动态游标类型:
TYPE *cursor_type* IS REF CURSOR [ RETURN *return_type* ];
- 声明一个变量使用上面的动态游标类型:
*cursor_variable*
*cursor_type;*
声明一个记录用于保存游标返回的记录:
*record_name return_type;*
在执行部分
打开游标变量绑定到特定查询:
OPEN *cursor_variable* FOR *query;*
- 从游标记录集中获取行数据。每次一行,结果下面格式的 LOOP 语句一起使用可以获取多行数据。
LOOP
FETCH cursor_variable INTO record_name;
EXIT WHEN cursor_variable%NOTFOUND;
statement;
[ statement; ]...
END LOOP;
c. 关闭游标:CLOSE *cursor_name*;
或者,您也可以重新打开游标变量,绑定到另外一个查询(会自动关闭当前查询的游标),重复前面的步骤。
- 示例:使用游标变量循环获取记录集的每行记录
delimiter /
CREATE OR REPLACE PACKAGE pkg_ware_mgmt AS
TYPE TYPE_REFCURSOR_WARE IS REF CURSOR RETURN ware%ROWTYPE;
PROCEDURE sp_record_print;
END;
/
delimiter ;
delimiter /
CREATE OR REPLACE PACKAGE BODY pkg_ware_mgmt
AS
PROCEDURE sp_record_print_by_record(p_cursor IN TYPE_REFCURSOR_WARE)
AS
rec_ware ware%ROWTYPE;
BEGIN
LOOP
dbms_output.put_line('Try to fetch a row from the ref cursor .');
FETCH p_cursor INTO rec_ware;
EXIT WHEN p_cursor%NOTFOUND ;
dbms_output.put_line('Print a record :');
dbms_output.put_line('W_ID : ' || rec_ware.w_id
|| ', W_YTD : ' || rec_ware.w_ytd
|| ', W_TAX : ' || rec_ware.w_tax
|| ', W_NAME : ' || rec_ware.w_name
|| ', W_STREET_1 : ' || rec_ware.w_street_1
|| ', W_STREET_2 : ' || rec_ware.w_street_2
|| ', W_CITY : ' || rec_ware.w_city
|| ', W_STATE : ' || rec_ware.w_state
|| ', W_ZIP : ' || rec_ware.w_zip )
;
dbms_output.put_line('');
END LOOP;
dbms_output.put_line('Processed ' || p_cursor%ROWCOUNT || ' rows. ');
END;
PROCEDURE sp_record_print
IS
cursor_ware TYPE_REFCURSOR_WARE ;
BEGIN
OPEN cursor_ware FOR SELECT * FROM ware ORDER BY w_id ;
dbms_output.put_line('Open a ref cursor using query at ware.');
sp_record_print_by_record(cursor_ware);
CLOSE cursor_ware;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Raise an unkown exception !');
END ;
END;
/
delimiter ;
obclient> set serveroutput on;
Query OK, 0 rows affected (0.00 sec)
obclient> call pkg_ware_mgmt.sp_record_print();