【问题标题】:ORACLE SQL- After delete trigger on parent table with cascade set null, mutating error workaroundORACLE SQL-在级联设置为空的父表上删除触发器后,变异错误解决方法
【发布时间】:2015-05-05 12:48:35
【问题描述】:

在删除父表 cars 后,我正在尝试更新子表 service 中的列,使用函数 choose_ideal_carcarsservice 表使用一些选择。

这是我的 sql 脚本的一部分:

CREATE TABLE cars(car_id INT CONSTRAINT pk_id_cars);
CREATE TABLE service(
service_id INT CONSTRAINT pk_id_service PRIMARY KEY,
car_id INT CONSTRAINT fk_id_car REFERENCES cars(car_id) ON DELETE SET NULL,
period VARCHAR2(5) CONSTRAINT check_period CHECK period IN ('even','odd','every'),
period VARCHAR2(3) CONSTRAINT check_day CHECK day IN ('mon','tue','wed','thu','fri')
);
CREATE OR REPLACE TRIGGER service_set_car_id AFTER DELETE ON cars
DECLARE
CURSOR touched_rows is select * from service where car_id = null;
touched_row service%ROWTYPE;
BEGIN
OPEN touched_rows;
  LOOP
  FETCH touched_rows INTO touched_row;
  EXIT WHEN touched_rows%NOTFOUND;
  UPDATE service SET car_id = choose_ideal_car(touched_row.period,touched_row.day) WHERE service_id = touched_row.service_id;
  END LOOP;
CLOSE touched_rows;
end;
/

由于某种原因,我的触发器从未被触发。

我也尝试过创建这样的触发器:

CREATE OR REPLACE TRIGGER service_set_car_id AFTER DELETE FROM cars FOR EACH ROW
CURSOR touched_rows is select * from service where car_id = :old.car_id;
...

因为函数choose_ideal_car 使用两个表中的选择而被触发但抛出“变异错误”。也许解决方案是创建我的cars 表的副本并在我的choose_ideal_car 函数中从中进行选择,而不是从我的触发器定义的cars 表中进行选择,但这对我来说听起来并不好。

在我写这篇文章时,我意识到即使我的第一个触发器被触发,它也无法正常工作并引发相同的“变异错误”。

所以最后我有两个问题:

1) 为什么第一个触发器从未触发?

2) 如何修复这个变异错误并让所有工作正常?

【问题讨论】:

    标签: sql oracle plsql triggers


    【解决方案1】:

    where car_id = null 不返回任何行,请改用where car_id is null

    【讨论】:

    • 顺便说一句。当您除了循环中的更新之外不进行任何额外操作时,您可以只使用一行而不是光标和循环:UPDATE service SET car_id = choose_ideal_car(period,day) WHERE car_id IS NULL;
    • 哦..那个空比较真是愚蠢的错误......如果我使用这个单行更新是不是函数计算一次并且所有更新的行都将具有相同的值?我选择循环是因为函数的结果取决于service 表中的值,所以我想确保将为每一行计算函数。
    • @JanTomášek 该函数将为每个受影响的行计算
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多