Is er een fout die u ziet wanneer u deze procedure uitvoert of uitvoert in SQLPLUS? Kunt u uw sqlplus-sessie posten zoals deze is?
PRINT is een sqlplus-specifieke opdracht en kan niet binnen het procedureblok worden aangeroepen. Als u de resultaten van een refcursor binnen een procedure moet afdrukken, moet u deze ophalen en elk record afdrukken in het formaat dat u nodig hebt.
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
U moet ook uw procedure (of) de procedureaanroep wijzigen om verschillende namen van variabelen te hebben. Algemeen, ik laat alle invoervariabelen voorafgaan door "i_" en alle uitvoervariabelen door "o_". Op deze manier zou uw procedureverklaring er als volgt uitzien..
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 ....
en de procedure-aanroep zou zijn..
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
U hoeft de ":" in het begin niet te gebruiken voor deze variabelen omdat het geen hostomgevingsvariabelen zijn (dit is het geval voor uw tweede uitvoering met SQLPLUS waarbij u de sqlplus-variabele "rc" gebruikt in de procedureaanroep)