【问题标题】:How to call no argument stored procedure inside Trigger如何在触发器内调用无参数存储过程
【发布时间】:2018-02-04 05:08:10
【问题描述】:

我正在尝试从触发器调用存储过程

create or replace trigger trg_insert
after insert on dbuser_m1 
for each row 
begin
InsertData;
end;

但低于错误

ORA-04088: 执行触发器时出错 'OWS_GO_UAT_02.TRG_INSERT' 04091. 00000 - “表 %s.%s 正在变异,触发器/函数可能看不到它” *原因:触发器(或用户定义的 plsql 函数,在 这个语句)试图查看(或修改)一个表 在被触发它的语句修改的过程中。 *操作:重写触发器(或函数),使其不读取该表。

有人可以帮我吗?谢谢,

【问题讨论】:

  • 这是在触发器中调用存储过程的正确方法吗?
  • 它与调用“无参数过程”无关。问题是您的无参数过程正试图访问同一个表。向我们展示InsertData 的代码,或者让我们知道您要在其中做什么。

标签: oracle database-trigger


【解决方案1】:

除了@KaushikNayak 所说的之外,您似乎有一个来自表dbuser_m1select,而它正在由DML 处理(在这种情况下为insert)。

我们不知道您在InsertData 中的代码,

但是我猜

而不是使用这样的声明select col1, col2 into v_col1, v_col2 from dbuser_m1;
您可以在调用时将一些带有dbuser_m1 列值的参数的赋值应用到您的过程中,例如InsertData(:old.col1,:old.col2),并且在被调用的过程中可能有赋值:

v_col1 := :old.col1; v_col2 := :old.col2;

其中v_col1 的类型为dbuser_m1.col1%typev_col2 的类型为dbuser_m1.col2%type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多