【问题标题】:Trigger Code returns 'Mutating' error触发代码返回“变异”错误
【发布时间】:2018-07-26 12:53:26
【问题描述】:

学习触发器,并尝试执行一项基本任务,在我对另一个名为 xml_hours_load 的表执行插入语句后,我将单个数据条目插入名为 xml_hours_load_2 的表中。但是,在我尝试在 xml_hours_load 中插入语句后,我收到如下错误: *SQL 错误:ORA-04091:表 XML_HOURS_LOAD 正在变异,触发器/函数可能看不到它 ORA-06512:在“TEST_TRIGGER”,第 5 行 ORA-04088: 执行触发器 'TEST_TRIGGER' 期间出错 04091. 00000 - “表 %s.%s 正在变异,触发器/函数可能看不到它” 原因:触发器(或用户定义的 plsql 函数,在 这个语句)试图查看(或修改)一个表 正在被触发它的语句修改。

下面是我的触发代码和我的插入语句:

create or replace TRIGGER test_trigger
AFTER INSERT
ON xml_hours_load
FOR EACH ROW

DECLARE
varROW_ID Varchar(50);

BEGIN
SELECT row_id INTO varROW_ID
from xml_hours_load;

INSERT INTO xml_hours_load_2
VALUES(varROW_ID, '2', '3', '5', '6', 'hi');
END;

insert into xml_hours_load(product_number, code, 
product_name, product_version, contact)
values('5', 'hello', 'no', '1', 'technical');

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

重写触发器(或函数),使其不读取该表。触发器需要重写为

create or replace TRIGGER test_trigger
AFTER INSERT
ON xml_hours_load
FOR EACH ROW
WHEN (new.ROW_ID IS NOT NULL)
    DECLARE

    BEGIN

    INSERT INTO xml_hours_load_2
    VALUES(:new.row_id, '2', '3', '5', '6', 'hi');
    END;

:new 值是在表 xml_hours_load 中修改的值

【讨论】:

  • 如果我需要将另一个列从 xml_hours_load 调用到 xml_hours_load_2 会发生什么?例如:INSERT INTO xml_hours_load_2 VALUES(:new.row_id, column_name, '3', '5', '6', 'hi');
  • 是新插入的 xml_hours_load 中的 column_name,已触发触发器。然后你可以给它:new.column_name。 :new 是插入到 xml_hours_load 中的新值
  • 非常感谢。赞成并被选为最佳答案!
  • 抱歉还有一件事,如果我想在插入前添加“CASE 语句”,我该怎么做?这可能吗?还是我现在必须定义变量?我所做的是在下面,但不确定是否正确......在 xml_hours_load 上插入后创建或替换 TRIGGER test_trigger FOR EACH DECLARE BEGIN CASE WHEN xml_hours_load.row_id 不为空 THEN INSERT INTO xml_hours_load_2 VALUES(:new.ROW_ID, : new.product_number, '3', '5', '6', 'hi');结束;
  • 我在上面编辑了我的代码。因此,使用此代码.. 当 row_id 为空时,记录将插入 xml_hours_load 但不会插入 xml_hours_load_2
猜你喜欢
  • 2018-02-19
  • 2018-09-15
  • 2016-04-20
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2014-07-03
相关资源
最近更新 更多