下面步骤展示了如何使用显式游标循环获取记录集的每行记录。

    1. 首先在声明部分。

    a. 声明一个游标。

    1. CURSOR cursor_name IS query;

    或者

    1. CURSOR cursor_name(para_namedata_type) IS query;

    b. 声明一个记录保存游标返回的行记录。

    1. record_name cursor_name%ROWTYPE;
    1. 然后在执行部分。

    a. 打开游标

    1. OPEN cursor_name;

    或者

    1. OPEN cursor_name(para_name);

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

    1. LOOP
    2. FETCHcursor_name INTO record_name;
    3. EXIT WHENcursor_name%NOTFOUND;
    4. statement;
    5. [ statement; ]...
    6. END LOOP;

    c. 关闭游标

    1. CLOSE cursor_name;

    示例:使用显式游标循环获取记录集的每行记录

    1. delimiter /
    2. CREATE OR REPLACE PACKAGE pkg_ware_mgmt as
    3. PROCEDURE sp_record_print(p_w_id IN ware.w_id%type);
    4. END;
    5. /
    6. delimiter ;
    7. delimiter /
    8. CREATE OR REPLACE PACKAGE BODY pkg_ware_mgmt
    9. AS
    10. PROCEDURE sp_record_print_by_record(p_record IN ware%ROWTYPE)
    11. AS
    12. BEGIN
    13. dbms_output.put_line('Print a record :');
    14. dbms_output.put_line('W_ID : ' || p_record.w_id
    15. || ', W_YTD : ' || p_record.w_ytd
    16. || ', W_TAX : ' || p_record.w_tax
    17. || ', W_NAME : ' || p_record.w_name
    18. || ', W_STREET_1 : ' || p_record.w_street_1
    19. || ', W_STREET_2 : ' || p_record.w_street_2
    20. || ', W_CITY : ' || p_record.w_city
    21. || ', W_STATE : ' || p_record.w_state
    22. || ', W_ZIP : ' || p_record.w_zip )
    23. ;
    24. dbms_output.put_line('');
    25. END;
    26. PROCEDURE sp_record_print(p_w_id IN ware.w_id%TYPE )
    27. IS
    28. CURSOR c1(cp_w_id ware.w_id%TYPE ) IS SELECT * FROM ware WHERE w_id = cp_w_id ;
    29. r_ware ware%ROWTYPE;
    30. BEGIN
    31. OPEN c1(p_w_id);
    32. dbms_output.put_line('Open a cursor with a parameter [ ' || p_w_id || ' ].');
    33. LOOP
    34. FETCH c1 INTO r_ware ;
    35. dbms_output.put_line('Fetch the cursor one time.');
    36. EXIT WHEN c1%NOTFOUND ;
    37. sp_record_print_by_record(r_ware);
    38. END LOOP;
    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)
    48. obclient> call pkg_ware_mgmt.sp_record_print(1);
    49. Query OK, 0 rows affected (0.12 sec)
    50. Open a cursor with a parameter [ 1 ].
    51. Fetch the cursor one time.
    52. Print a record :
    53. W_ID : 1, W_YTD : 1200, W_TAX : .1868, W_NAME : W_NAME_1, W_STREET_1 : jTNkXKWXOdh, W_STREET_2 : lf9QXTXXGoF04IZBkCP7, W_CITY : srRq15uvxe5, W_STATE : GQ, W_ZIP : 506811111
    54. Fetch the cursor one time.
    55. obclient>