Czy wystąpił błąd, który widzisz podczas wykonywania tej procedury lub uruchamiania jej w SQLPLUS? Czy możesz opublikować sesję sqlplus tak, jak jest?
PRINT jest poleceniem specyficznym dla sqlplus i nie można go wywołać wewnątrz bloku proceduralnego. Jeśli chcesz wydrukować wyniki refcursora wewnątrz procedury , musisz pobrać z niej i wydrukować każdy rekord w wymaganym formacie.
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
Powinieneś również zmienić swoją procedurę (lub) wywołanie procedury, aby mieć różne nazwy zmiennych.generallt, wszystkie zmienne wejściowe poprzedzam "i_" i wszystkie zmienne wyjściowe "o_". W ten sposób Twoja deklaracja procedury będzie wyglądać jak...
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 ....
a wywołanie procedury byłoby...
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
Nie musisz używać ":" na początku dla tych zmiennych, ponieważ nie są to zmienne środowiskowe hosta (tak jest w przypadku twojego drugiego wykonania przy użyciu SQLPLUS, gdzie używasz zmiennej sqlplus "rc" wewnątrz wywołania procedury)