【问题标题】:Stored procedures with triggers oracle 11goracle 11g 带触发器的存储过程
【发布时间】:2013-11-07 12:29:19
【问题描述】:

我有一个由 4 个不同的触发器调用的存储过程 执行过程时是否可以获取触发器的名称等信息。

我可以通过向过程传递一个额外的参数来做到这一点, 还有其他选择吗? 我正在使用 oracle 11g。 谢谢

【问题讨论】:

  • 您可以在过程中添加一个附加参数来传递此触发器名称。
  • 不幸的是,触发器显然没有出现在堆栈回溯中。请参阅stackoverflow.com/questions/7032373/… 如何获取堆栈跟踪,但在我的测试中,不包括触发器名称。

标签: plsql oracle11g


【解决方案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';

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多