【问题标题】:Oracle trigger - updating a row should update multiple rows in the same table based on conditionOracle 触发器 - 更新一行应根据条件更新同一张表中的多行
【发布时间】:2016-06-07 22:19:49
【问题描述】:

我已经编写了一个触发器来根据更新记录的值更新(之前)表中的记录

CREATE OR REPLACE TRIGGER CONTACTS_UPDATE_TRIGGER 
BEFORE UPDATE  ON CONTACTS 
FOR EACH ROW 
BEGIN 
IF :NEW.CONTACT_TYPE= 'PRIMARY' THEN  
UPDATE CONTACTS SET CONTACT_TYPE= NULL WHERE CONTACT_TYPE = 'PRIMARY' AND HOSPITAL_ID = :NEW.HOSPITAL_ID ;
END IF;
END;

但出现表变异错误。有没有其他方法可以根据oracle db中更新的行中的值来更新表中的其他行

【问题讨论】:

  • 这通常会导致变异表错误。最简单的解决方案是将信息存储在另一个表中。
  • 或者尝试将事务设置为 AUTONOMOUS 但非常不推荐,或者尝试将其转换为 STATEMENT LEVEL TRIGGER 而不是 ROW LEVEL Trigger
  • 如果我将其设为语句级别,我是否能够访问正在更新的记录。因为我的更新查询基于更新记录中存在的条件(基于联系人类型当前记录)

标签: oracle database-trigger


【解决方案1】:

如果我是你,而不是使用触发器,我会将原始更新语句(最好在存储过程中,这是唯一可以更新表的内容,但是嘿嘿,YMMV)修改为:

update contacts
set    contact_type= case when contact_type = 'PRIMARY' then null
                          when hospital_id = :hospital_id then 'PRIMARY'
                     end
where  contact_type = 'PRIMARY'
or     hospital_id = :hospital_id;

这是一个测试用例:

设置

create table contacts (hospital_id number,
                       contact_type varchar2(10),
                       val number);

insert into contacts (hospital_id, contact_type, val)
select 1, 'PRIMARY', 100 from dual union all
select 2, null, 200 from dual union all
select 3, null, 300 from dual;

commit;

select * from contacts
order by hospital_id;

HOSPITAL_ID CONTACT_TYPE        VAL
----------- ------------ ----------
          1 PRIMARY             100
          2                     200
          3                     300

更新基层医院

update contacts
set    contact_type= case when contact_type = 'PRIMARY' then null
                          when hospital_id = 3 then 'PRIMARY'
                     end
where  contact_type = 'PRIMARY'
or     hospital_id = 3;

commit;

结果

select * from contacts
order by hospital_id;

HOSPITAL_ID CONTACT_TYPE        VAL
----------- ------------ ----------
          1                     100
          2                     200
          3 PRIMARY             300

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多