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

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

    4. 从游标记录集中获取行数据。每次一行,结果下面格式的 LOOP 语句一起使用可以获取多行数据。

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

    • 示例:使用游标变量循环获取记录集的每行记录
    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. dbms_output.put_line('Try to fetch a row from the ref cursor .');
    15. FETCH p_cursor INTO rec_ware;
    16. EXIT WHEN p_cursor%NOTFOUND ;
    17. dbms_output.put_line('Print a record :');
    18. dbms_output.put_line('W_ID : ' || rec_ware.w_id
    19. || ', W_YTD : ' || rec_ware.w_ytd
    20. || ', W_TAX : ' || rec_ware.w_tax
    21. || ', W_NAME : ' || rec_ware.w_name
    22. || ', W_STREET_1 : ' || rec_ware.w_street_1
    23. || ', W_STREET_2 : ' || rec_ware.w_street_2
    24. || ', W_CITY : ' || rec_ware.w_city
    25. || ', W_STATE : ' || rec_ware.w_state
    26. || ', W_ZIP : ' || rec_ware.w_zip )
    27. ;
    28. dbms_output.put_line('');
    29. END LOOP;
    30. dbms_output.put_line('Processed ' || p_cursor%ROWCOUNT || ' rows. ');
    31. END;
    32. PROCEDURE sp_record_print
    33. cursor_ware TYPE_REFCURSOR_WARE ;
    34. BEGIN
    35. OPEN cursor_ware FOR SELECT * FROM ware ORDER BY w_id ;
    36. dbms_output.put_line('Open a ref cursor using query at ware.');
    37. sp_record_print_by_record(cursor_ware);
    38. CLOSE cursor_ware;
    39. EXCEPTION
    40. WHEN OTHERS THEN
    41. dbms_output.put_line('Raise an unkown exception !');
    42. END ;
    43. END;
    44. /
    45. delimiter ;
    46. obclient> set serveroutput on;
    47. Query OK, 0 rows affected (0.00 sec)