このプロシージャを実行したり、SQLPLUSで実行したりすると、エラーが表示されますか?sqlplusセッションをそのまま投稿できますか?
PRINTはsqlplus固有のコマンドであり、手続き型ブロック内で呼び出すことはできません。プロシージャ内でrefcursorの結果を印刷する必要がある場合は、refcursorからフェッチして、必要な形式で各レコードを印刷する必要があります。
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
また、プロシージャ(または)プロシージャ呼び出しを変更して、異なる変数名を使用する必要があります。generallt、すべての入力変数の前に「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変数「rc」を使用するSQLPLUSを使用した2回目の実行の場合です)