Có lỗi nào bạn gặp khi thực hiện thủ tục này hoặc chạy nó trong SQLPLUS không? Bạn có thể đăng phiên sqlplus của mình như hiện tại không?
PRINT là một lệnh cụ thể của sqlplus và nó không thể được gọi bên trong khối thủ tục. Nếu bạn cần in kết quả của một con trỏ trỏ chuột bên trong một thủ tục, thì bạn sẽ cần tìm nạp từ nó và in từng bản ghi ở định dạng mà bạn cần.
SQL> create or replace procedure test_REFCURSOR (
2 i_number in number,
3 o_cursor out sys_refcursor)
4 as
5 begin
6 open o_cursor for
7 'select empno, ename from emp
8 where rownum < ' || i_number ;
9 end;
10 /
Procedure created.
SQL> variable rc refcursor;
SQL> exec test_refcursor(5, :rc);
PL/SQL procedure successfully completed.
SQL> print rc;
EMPNO ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
Bạn cũng nên thay đổi thủ tục của mình (hoặc) lệnh gọi thủ tục để có các tên biến khác nhau.generallt, tôi đặt tiền tố cho tất cả các biến đầu vào bằng "i_" và tất cả các biến đầu ra bằng "o_". Bằng cách này, khai báo thủ tục của bạn sẽ trông giống như ..
CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (i_Site IN VARCHAR2,
i_Buyer IN VARCHAR2,
i_Supplier IN VARCHAR2,
o_Cursor OUT SYS_REFCURSOR) AS ....
và lệnh gọi thủ tục sẽ là ..
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
Bạn không cần sử dụng ":" ngay từ đầu cho các biến này vì chúng không phải là biến môi trường máy chủ (đây là trường hợp cho lần thực thi thứ hai của bạn bằng cách sử dụng SQLPLUS trong đó bạn sử dụng biến sqlplus "rc" bên trong lệnh gọi thủ tục)