oracle 11g 带触发器的存储过程
Posted
技术标签:
【中文标题】oracle 11g 带触发器的存储过程【英文标题】:Stored procedures with triggers oracle 11g 【发布时间】:2013-11-07 12:29:19 【问题描述】:我有一个由 4 个不同的触发器调用的存储过程 执行过程时是否可以获取触发器的名称等信息。
我可以通过向过程传递一个额外的参数来做到这一点, 还有其他选择吗? 我正在使用 oracle 11g。 谢谢
【问题讨论】:
您可以在过程中添加一个附加参数来传递此触发器名称。 不幸的是,触发器显然没有出现在堆栈回溯中。请参阅***.com/questions/7032373/… 如何获取堆栈跟踪,但在我的测试中,不包括触发器名称。 【参考方案1】:您可以使用dbms_utility.format_call_stack
记录的函数here:
SQL> set serveroutput on
SQL> create table test_table (n number);
Table created.
SQL> create or replace procedure test_procedure as
2 begin
3 dbms_output.put_line(dbms_utility.format_call_stack);
4 end;
5 /
Procedure created.
SQL> create or replace trigger test_trigger_insert
2 before insert on test_table
3 for each row
4 begin
5 test_procedure;
6 end;
7 /
Trigger created.
SQL> create or replace trigger test_trigger_delete
2 before delete on test_table
3 for each row
4 begin
5 test_procedure;
6 end;
7 /
Trigger created.
SQL> rem direct execution of the procedure
SQL> exec test_procedure;
----- PL/SQL Call Stack -----
object line object
handle number name
0x2bc2f1ca0 3 procedure YOUR_SCHEMA.TEST_PROCEDURE
0x31a218568 1
anonymous block
PL/SQL procedure successfully completed.
SQL> rem procedure called by trigger test_trigger_insert
SQL> insert into test_table (n) values (42);
----- PL/SQL Call Stack -----
object line object
handle number name
0x2bc2f1ca0 3 procedure YOUR_SCHEMA.TEST_PROCEDURE
0x2adc40fb0 2
YOUR_SCHEMA.TEST_TRIGGER_INSERT
1 row created.
SQL> rem procedure called by trigger test_trigger_delete
SQL> delete from test_table where n = 42;
----- PL/SQL Call Stack -----
object line object
handle number name
0x2bc2f1ca0 3 procedure YOUR_SCHEMA.TEST_PROCEDURE
0x2f10ffd28 2
YOUR_SCHEMA.TEST_TRIGGER_DELETE
1 row deleted.
【讨论】:
解决了我的问题,谢谢@marco baldelli 的详细解答【参考方案2】:如果您的触发器名为 My_Trigger,您可以试试这个:
SELECT Trigger_type, Triggering_event, Table_name
FROM USER_TRIGGERS
WHERE Trigger_name = 'My_Trigger';
【讨论】:
以上是关于oracle 11g 带触发器的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 存储过程 - 也许 10g 和 11g 之间的区别?