正如其他人在您的 cmets 中所说,唯一的选择是解析调用堆栈。我在下面创建了一个示例,说明如何通过触发器做到这一点。
演示表
CREATE TABLE test_ids
(
id NUMBER
);
CREATE TABLE insert_log
(
insert_date DATE,
insert_value NUMBER,
call_stack VARCHAR2 (4000),
calling_procedure VARCHAR2 (4000)
);
演示触发器
下面的触发器会将每个插入记录到insert_log 表中的test_ids 表中。您可以存储DBMS_UTILITY.format_call_stack 的完整堆栈以帮助您进行故障排除,也可以仅存储调用过程。在我搭建的demo中,insert的调用过程会一直保存在第5行(第4行是触发器),从第23行开始。
CREATE OR REPLACE TRIGGER test_ids_after_insert
AFTER INSERT
ON test_ids
FOR EACH ROW
DECLARE
l_stack VARCHAR2 (4000) := DBMS_UTILITY.format_call_stack;
BEGIN
INSERT INTO insert_log (insert_date,
insert_value,
call_stack,
calling_procedure)
VALUES (SYSDATE,
:NEW.id,
l_stack,
SUBSTR (l_stack,
INSTR (l_stack,
CHR (10),
1,
4)
+ 23,
INSTR (l_stack,
CHR (10),
1,
5)
- ( INSTR (l_stack,
CHR (10),
1,
4)
+ 23)));
END;
/
测试程序
只是为了演示触发器的一些不同输出
CREATE OR REPLACE PROCEDURE test_insert (p_num NUMBER)
IS
BEGIN
INSERT INTO test_ids
VALUES (p_num);
END;
/
测试插入
INSERT INTO test_ids
VALUES (1);
DECLARE
PROCEDURE insert_function (p_num NUMBER)
IS
BEGIN
INSERT INTO test_ids
VALUES (p_num);
END;
BEGIN
INSERT INTO test_ids
VALUES (2);
insert_function (3);
test_insert (4);
END;
/
演示结果
这就是insert_log 的结果。如果插入语句自己执行,则不会有调用过程,匿名块被记录为匿名块,如果从过程/函数/包中调用,则将存储该对象的名称。
INSERT_DATE INSERT_VALUE CALL_STACK CALLING_PROCEDURE
______________ _______________ ___________________________________________________ ________________________________
09-OCT-20 1 ----- PL/SQL Call Stack -----
object line object
handle number name
0x6ab98970 2 EJSTEST.TEST_IDS_AFTER_INSERT
09-OCT-20 2 ----- PL/SQL Call Stack ----- anonymous block
object line object
handle number name
0x6ab98970 2 EJSTEST.TEST_IDS_AFTER_INSERT
0x6727e250 9 anonymous block
09-OCT-20 3 ----- PL/SQL Call Stack ----- anonymous block
object line object
handle number name
0x6ab98970 2 EJSTEST.TEST_IDS_AFTER_INSERT
0x6727e250 5 anonymous block
0x6727e250 12 anonymous block
09-OCT-20 4 ----- PL/SQL Call Stack ----- procedure EJSTEST.TEST_INSERT
object line object
handle number name
0x6ab98970 2 EJSTEST.TEST_IDS_AFTER_INSERT
0x615b3ce0 4 procedure EJSTEST.TEST_INSERT
0x6727e250 13 anonymous block