Er der en fejl, du ser, når du udfører denne procedure eller kører den i SQLPLUS? Kan du sende din sqlplus-session, som den er?
PRINT er en sqlplus-specifik kommando, og den kan ikke kaldes inde i den proceduremæssige blok. Hvis du har brug for at udskrive resultaterne af en refcursor inde i en procedure , så skal du hente fra den og udskrive hver post i det format, du har brug for.
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
Du bør også ændre din procedure (eller) procedurekaldet til at have forskellige variabelnavne.generallt, jeg præfikser alle inputvariabler med "i_" og alle outputvariabler med "o_". På denne måde vil din procedureerklæring se ud som...
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 ....
og procedurekaldet ville være...
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
Du behøver ikke bruge ":" i begyndelsen for disse variable, da de ikke er værtsmiljøvariabler (dette er tilfældet for din anden udførelse ved brug af SQLPLUS, hvor du bruger sqlplus-variablen "rc" inde i procedurekaldet)