3

PL / SQL Developerを使用しており、レポートを実行するためのプロシージャを作成しました。結果セットを出力するためのプロシージャが必要です。

プロシージャは入力パラメータを受け入れ、結果セットを出力する必要があります。

プロシージャが、プロシージャに渡すパラメータを受け入れるいくつかのAPIを呼び出すため、ビューを使用できません。

多くの検索から、ref_cursorを使用して可能であることがわかりましたが、tiを機能させることができません。

手順の簡略化されたバージョンは次のとおりです。

CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (vSite     IN VARCHAR2,
                                                    vBuyer    IN VARCHAR2,
                                                    vSupplier IN VARCHAR2,
                                                    vCursor   OUT SYS_REFCURSOR)   
AS                                                    
BEGIN
    OPEN vCursor FOR                   
        SELECT blah blah blah blah blah blah;
END;

手順を実行し、次を使用して結果セットを表示しようとしました。

BEGIN
    vsite       := 'S03';
    vbuyer      := 'AW';
    vsupplier   := '%';    
    vcursor     refcursor;

    IFSINFO.SHORTAGE_SHEET(vsite => :vsite,
                           vbuyer => :vbuyer,
                           vsupplier => :vsupplier,
                           vcursor => :vcursor);                           
    print vcursor;                           
END;

そしてまた:

variable rc refcursor; 
exec IFSINFO.SHORTAGE_SHEET('S03','AW','TQ1',:rc2); 
print rc2

しかし、どちらも機能しません。誰かが私が私の機知に富んでいるとアドバイスできますか?

ありがとうロブ

4

4 に答える 4

2

このプロシージャを実行するとき、またはSQLPLUSで実行するときに表示されるエラーはありますか?sqlplusセッションをそのまま投稿できますか?

PRINTはsqlplus固有のコマンドであり、手続き型ブロック内で呼び出すことはできません。プロシージャ内で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回目の実行の場合です)

于 2010-12-07T15:55:15.953 に答える
1

pl / sql開発者のこれの最後に、コードは次のとおりです。

結果セットを格納するオブジェクトを作成します

CREATE OR REPLACE TYPE ABC.TEST_TYPE
AS OBJECT
( 
  "Site"                       VARCHAR2(25),
);

上記のオブジェクトのテーブルとしてタイプを作成します

CREATE OR REPLACE TYPE ABC.TEST_COL 
    AS TABLE OF ABC.TEST_TYPE

SQLを実行するためのパッケージを作成します

CREATE OR REPLACE PACKAGE ABC.TEST_RPT AS
    FUNCTION get_report(vPart     VARCHAR2,
                        vBuyer    VARCHAR2,
                        vSupplier VARCHAR2) RETURN ABC.TEST_COL 
    PIPELINED;
END;

SQLを実行するためのパッケージ本体を作成します

CREATE OR REPLACE PACKAGE BODY ABC.TEST_RPT AS
  FUNCTION get_report(vPart     VARCHAR2,
                      vBuyer    VARCHAR2,
                      vSupplier VARCHAR2) RETURN ABC.TEST_COL 
    PIPELINED IS
    CURSOR cTest(vPart     VARCHAR2,
                 vBuyer    VARCHAR2,
                 vSupplier VARCHAR2) IS

          SELECT Site
            FROM table
           WHERE Part = vPart
             AND Buyer = vBuyer
             AND Supplier = vSupplier;



  BEGIN
    FOR part_rec IN cTest(vSite, vBuyer, vSupplier) LOOP
      PIPE ROW(ABC.TEST_TYPE(part_rec.Site));

    END LOOP;
    RETURN;
    CLOSE cTest;
  END;
END;

結果セットを実行して出力するコード

SELECT * FROM TABLE(ABC.TEST_RPT.get_report(''、''、''))

于 2010-12-09T15:32:20.553 に答える
0

これを実行するためにSQLPlusを使用していると思います。まず、SqlPlusリフレクターを定義します。

variable vcursor refcursor

次に、匿名のpl/sqlブロックを実行します。declareキーワード に注意してください。


DECLARE
          vsite       := 'S03';
          vbuyer      := 'AW';
          vsupplier   := '%';
          -- do not declare this, use sql plus bind var     vcursor     refcursor;
BEGIN
IFSINFO.SHORTAGE_SHEET(vsite => vsite, -- no colon vbuyer => vbuyer, vsupplier => vsupplier, vcursor => :vcursor); END; /

次に、このsqlplusコマンドを実行します。

print vcursor

印刷はpl/sqlではありません

于 2010-12-07T17:11:38.297 に答える
0

refカーソル変数はrcです。ただし、を使用しますrc2

に変更rc2するrcと、機能するはずです

于 2014-01-09T12:21:52.173 に答える