複数のパッケージ/ストアド プロシージャが DML ステートメントを実行するテーブル (Oracle 11g) があります。トリガーを使用してテーブルに DML を発行したパッケージ/プロシージャ名をキャプチャし、ログ テーブルに記録したいと考えています。
例えば:
パッケージは、テーブルの をMY_PACK.MY_PROC()
発行します。を発行したパッケージ/プロシージャ名を取得し、この情報を別のテーブルに保存できるトリガーを設計します。insert into...
mytab
mytab
insert into..
my_tab_log
検索を行ったところ、プロシージャ名を指摘できることがわかりました$$PLSQL_UNIT
が$$PLSQL_LINE
、これらの変数がトリガー内から使用されると、DML ステートメントを発行したパッケージ/プロシージャ名の代わりにトリガー名が取得されます。
お気に入り -
CREATE OR REPLACE TRIGGER my_trg
AFTER INSERT OR UPDATE OR DELETE
ON MY_TAB
FOR EACH ROW
BEGIN
IF INSERTING THEN
insert into my_tab_log values('INSERTED A ROW'
sysdate,
$$PLSQL_UNIT);
END IF;
-- This would capture Trigger name but I would like to capture `MY_PACK.MY_PROC()`
-- which issued the insert statement
...
END;
$$PLSQL_UNIT は条件付きコンパイル ディレクティブであるためです。PL/SQLコードをコンパイル/再コンパイルすると解決されます。残念ながら、トリガー内の $$PLSQL_UNIT はトリガー名にすぎず、トリガーのコンパイル時に解決されます。
手順も見つけましたowa_util.who_called_me
が、これを自分のニーズに合わせて使用する方法について頭を悩ませることができませんでした。DMLステートメントを発行する実際のパッケージ/ストアドプロシージャを変更せずに、私が望むものを達成することさえ可能ですか? これらのプログラムを変更することはできません。これは厳しい制限であるため、オプションではありません。