C'è un errore che vedi quando esegui questa procedura o la esegui in SQLPLUS?Puoi pubblicare la tua sessione sqlplus così com'è?
PRINT è un comando specifico di sqlplus e non può essere chiamato all'interno del blocco procedurale. Se devi stampare i risultati di un Refcursor all'interno di una procedura , dovrai recuperarlo e stampare ogni record nel formato che ti serve.
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
Dovresti anche cambiare la tua procedura (o) la chiamata della procedura per avere nomi di variabili diversi.generallt, io prefisso tutte le variabili di input con "i_" e tutte le variabili di output con "o_". In questo modo, la tua dichiarazione di procedura sembrerebbe...
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 ....
e la chiamata alla procedura sarebbe..
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
Non è necessario utilizzare ":" all'inizio per queste variabili poiché non sono variabili di ambiente host (questo è il caso della seconda esecuzione utilizzando SQLPLUS in cui si utilizza la variabile sqlplus "rc" all'interno della chiamata di procedura)