1

PL/SQL で単純なストアド プロシージャを作成して、同等の処理を実行しました。

   SELECT * FROM tablename

参照カーソルを返す手順は次のとおりです

   create or replace
   procedure proc_name (outVal OUT sys_refcursor) as
   myCursor sys_refcursor;
   myRecords records%ROWTYPE;
   l_sql VARCHAR(2000);
   begin
        l_sql := 'SELECT * FROM RECORDS';
        open myCursor for l_sql;
        loop
            FETCH myCursor INTO myRecords;
            EXIT WHEN myCursor%NOTFOUND;
            "DBMS_OUTPUT.put_line('myRecords.name =' || myRecords.name);"
        end loop;
   close myCursor;
   end;

コードに引用符で囲まれた行を含めずにSQLコマンドプロンプトでプロシージャを実行したい場合は、この方法で実行します

   VARIABLE cr REFCURSOR
   EXEC proc_name(:cr)

今、私はプロンプトが表示されます

   PL/SQL procedure successfully completed

コマンドを実行しようとすると

   print cr;

エラーが発生する

   ORA-24338: Statement handle not executed

これで私を助けてください。ストアド プロシージャによって返されたこの参照カーソルだけを使用して、テーブルを印刷する方法を知る必要があります。私は手順自体に何も出力したくないので、手順から引用符で囲まれた行をまとめて削除したいと考えています。

4

1 に答える 1

1

カーソルがプロシージャによって閉じられているため、エラーが発生するため、「印刷」できません。次のことをお勧めします。

  1. ログSET SERVEROUTPUT ONを確認できるように、SQL*Plus でプロシージャを実行する前に必ず実行してください。DBMS_OUTPUTこの出力をデバッグ/ロギングに使用します。

  2. 後で表示されるカーソルを返したい場合は、プロシージャでカーソルを取得しないでください。

    SQL> CREATE OR REPLACE PROCEDURE p (x OUT SYS_REFCURSOR) IS
      2  BEGIN
      3     OPEN x FOR SELECT * FROM DUAL;
      4  END;
      5  /
    
    Procedure created.
    
    SQL> VARIABLE x REFCURSOR;
    SQL> EXEC p(:x);
    
    PL/SQL procedure successfully completed.
    
    SQL> PRINT x;
    
    DUM
    ---
    X
    

PRINTカーソルを適切にフェッチしてクローズするのは、PL/SQLプロシージャではなく、コール元アプリケーション(ここでは SQL*Plus )の責任であることに注意してください。

于 2012-07-10T09:19:59.600 に答える