下面描述使用游标变量循环获取记录集的每行记录方法。

    1. 在声明部分

    2. 定义动态游标类型:​TYPE *cursor_type* IS REF CURSOR [ RETURN *return_type* ];

    3. 声明一个变量使用上面的动态游标类型:​*cursor_variable**cursor_type;*
    4. 声明一个记录用于保存游标返回的记录:​*record_name return_type;*

    5. 在执行部分

    6. 打开游标变量绑定到特定查询:​OPEN *cursor_variable* FOR *query;*

    7. 从游标记录集中获取行数据。每次一行,结果下面格式的 LOOP 语句一起使用可以获取多行数据。
    1. LOOP
    2. FETCH cursor_variable INTO record_name;
    3. EXIT WHEN cursor_variable%NOTFOUND;
    4. statement;
    5. [ statement; ]...
    6. END LOOP;

    c. 关闭游标:​CLOSE *cursor_name*;

    或者,您也可以重新打开游标变量,绑定到另外一个查询(会自动关闭当前查询的游标),重复前面的步骤。

    • 示例:使用游标变量循环获取记录集的每行记录
    1. delimiter /
    2. CREATE OR REPLACE PACKAGE pkg_ware_mgmt AS
    3. TYPE TYPE_REFCURSOR_WARE IS REF CURSOR RETURN ware%ROWTYPE;
    4. PROCEDURE sp_record_print;
    5. END;
    6. /
    7. delimiter ;
    8. delimiter /
    9. CREATE OR REPLACE PACKAGE BODY pkg_ware_mgmt
    10. AS
    11. PROCEDURE sp_record_print_by_record(p_cursor IN TYPE_REFCURSOR_WARE)
    12. AS
    13. rec_ware ware%ROWTYPE;
    14. BEGIN
    15. LOOP
    16. dbms_output.put_line('Try to fetch a row from the ref cursor .');
    17. FETCH p_cursor INTO rec_ware;
    18. EXIT WHEN p_cursor%NOTFOUND ;
    19. dbms_output.put_line('Print a record :');
    20. dbms_output.put_line('W_ID : ' || rec_ware.w_id
    21. || ', W_YTD : ' || rec_ware.w_ytd
    22. || ', W_TAX : ' || rec_ware.w_tax
    23. || ', W_NAME : ' || rec_ware.w_name
    24. || ', W_STREET_1 : ' || rec_ware.w_street_1
    25. || ', W_STREET_2 : ' || rec_ware.w_street_2
    26. || ', W_CITY : ' || rec_ware.w_city
    27. || ', W_STATE : ' || rec_ware.w_state
    28. || ', W_ZIP : ' || rec_ware.w_zip )
    29. ;
    30. dbms_output.put_line('');
    31. END LOOP;
    32. dbms_output.put_line('Processed ' || p_cursor%ROWCOUNT || ' rows. ');
    33. END;
    34. PROCEDURE sp_record_print
    35. IS
    36. cursor_ware TYPE_REFCURSOR_WARE ;
    37. BEGIN
    38. OPEN cursor_ware FOR SELECT * FROM ware ORDER BY w_id ;
    39. dbms_output.put_line('Open a ref cursor using query at ware.');
    40. sp_record_print_by_record(cursor_ware);
    41. CLOSE cursor_ware;
    42. EXCEPTION
    43. WHEN OTHERS THEN
    44. dbms_output.put_line('Raise an unkown exception !');
    45. END ;
    46. END;
    47. /
    48. delimiter ;
    49. obclient> set serveroutput on;
    50. Query OK, 0 rows affected (0.00 sec)
    51. obclient> call pkg_ware_mgmt.sp_record_print();