sql >> データベース >  >> RDS >> Oracle

Oracle10gストアドプロシージャの結果セットを表示する

    このプロシージャを実行したり、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回目の実行の場合です)



    1. DELIMITER //はトリガーで何をしますか?

    2. MySQLでテーブル変数を作成する

    3. Mysql datetimeDEFAULTCURRENT_TIMESTAMPエラー

    4. 深夜から現在までのギャップのある1時間ごとのデータを取得する