Има ли грешка, която виждате, когато изпълните тази процедура или я стартирате в SQLPLUS? Можете ли да публикувате вашата sqlplus сесия такава, каквато е?
PRINT е специфична за sqlplus команда и не може да бъде извикана вътре в процедурния блок. Ако трябва да отпечатате резултатите от рекурсор вътре в процедура, тогава ще трябва да извлечете от него и да отпечатате всеки запис във формата, от който се нуждаете.
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
Трябва също така да промените вашата процедура (или) извикването на процедурата, за да имате различни имена на променливи. Общо взето, поставям пред всички входни променливи "i_" и всички изходни променливи с "o_". По този начин декларацията на вашата процедура ще изглежда така..
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 ....
и извикването на процедурата ще бъде..
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
Не е необходимо да използвате ":" в началото за тези променливи, тъй като те не са променливи на хост средата (това е случаят с второто ви изпълнение с помощта на SQLPLUS, където използвате sqlplus променливата "rc" в извикването на процедура)