5

プロシージャを呼び出すときにランタイムパラメータ(値)のリストを取得するには、一般化されたメソッドが必要です。実行中のプロシージャの名前を返す$$PLSQL_UNITに似たものが必要です。(plsql Oracle 10g)

たとえば、このサンプル手順を見てください:(それは単にそれ自身の名前とパラメータを出力します)

CREATE OR REPLACE PROCEDURE  MY_PROC(ow in varchar2, tn IN varchar2)
 IS

BEGIN
     dbms_output.put_line('proc_name: '||$$PLSQL_UNIT||' parameters: '|| ow||' '||tn  );

    EXCEPTION
    WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE('ERRORE: ' ||SQLERRM);

END MY_PROC;
/

プロシージャを実行すると、次の出力が生成されます。

SQL> 
  1   BEGIN
  2     IBAD_OWN.MY_PROC('first_par', 'second_par');
  3   END;
  4  /

proc_name: MY_PROC parameters: first_par second_par

PL/SQL procedure successfully completed.

正しいパラメータ変数を設定するために各プロシージャをハードコーディングする必要があるため、すべてのプロシージャをコピーして貼り付けることができないため、満足できません。

助けてくれてありがとう。

4

2 に答える 2

2

Oracle PL/SQLのプロシージャに渡されたパラメータの値を動的に取得することはできません。この言語は、この種の操作を処理するようには設計されていません。

ちなみに、パッケージ内にあるプロシージャでは$$PLSQL_UNIT、パッケージの名前のみが返されます。プロシージャの名前を含む各プロシージャ内で、一貫した名前の定数を定義する方がよいと思います。

于 2012-09-06T13:25:26.777 に答える
1

あなたと同じ機能が欲しかったのですが、良い組み込みのソリューションは見つかりませんでした。

私がしたことは、関数/プロシージャ/パッケージの元の本体を変更するDBレベルのトリガーを作成したことです。このトリガーは、「user_arguments」から動的に生成されたコードの「begin」の直後に追加されます。

さらに、その後、このトリガーに、例外が発生したときにprocの呼び出しをログに記録するコードを含めます。

さらに、procs呼び出し、およびさらに多くの相互作用するものをトレースできます。

ただし、パフォーマンスが大幅に低下するため、このソリューションはプリプロダクションでのみ正常に機能します。

PS。英語が下手でごめんなさい。

于 2012-09-10T03:34:36.037 に答える