Таблица мутирует, триггер / функция может не видеть ее ошибка oracle db - PullRequest
0 голосов
/ 11 декабря 2018

У меня возникла проблема при обновлении столбца.У меня есть база данных с двумя таблицами, это оператор создания для таблиц:

create table trein (
trein_id number primary key,
naam varchar2(100) not null unique,
zitplekken number);

create table wagon(
wagon_id number primary key,
naam varchar2(100) not null unique,
zitplekken number not null,
trein_naam_fk varchar2(100));

Если я добавлю значение в wagon.trein_naam_fk, я хочу получить из той же строки значение zitplekken и добавить его в соответствующий train.zitplekken.Итак, я написал этот триггер для него:

CREATE OR REPLACE TRIGGER KOPPELWAGON_TRIGGER
AFTER UPDATE OF TREIN_NAAM_FK on WAGON
   FOR EACH ROW

DECLARE
   V_ZITPLEKKEN_W number;
   V_ZITPLEKKEN_T number;
   V_TREIN_NAAM varchar(100);
BEGIN

   -- Haal zitplaatsen wagon op
   SELECT ZITPLEKKEN, TREIN_NAAM_FK INTO V_ZITPLEKKEN_W, V_TREIN_NAAM FROM WAGON WHERE NAAM = :OLD.NAAM;
   -- Verhoog zitplekken trein
   UPDATE TREIN SET ZITPLEKKEN = ZITPLEKKEN + V_ZITPLEKKEN_W WHERE NAAM = V_TREIN_NAAM;
END;

/

Когда я выполняю следующую инструкцию по обновлению, я получаю сообщение об ошибке:

UPDATE WAGON SET TREIN_NAAM_FK = 't1' WHERE NAAM = 'w1';


Error starting at line : 1 in command -
UPDATE WAGON SET TREIN_NAAM_FK = 't1' WHERE NAAM = 'w1'
Error report -
ORA-04091: table RICHRAIL.WAGON is mutating, trigger/function may not see it
ORA-06512: at "RICHRAIL.KOPPELWAGON_TRIGGER", line 8
ORA-04088: error during execution of trigger 'RICHRAIL.KOPPELWAGON_TRIGGER'

Есть идеи, что я здесь не так делаю?

1 Ответ

0 голосов
/ 11 декабря 2018

Вы не можете выбрать данные из той же таблицы в триггере, где создан триггер, из-за этого конфликта вы получаете проблему.Даже выбор данных из той же таблицы не требует, как я понимаю, поэтому ваш код триггера должен выглядеть следующим образом:

CREATE OR REPLACE TRIGGER KOPPELWAGON_TRIGGER
AFTER UPDATE OF TREIN_NAAM_FK on WAGON
   FOR EACH ROW

/*DECLARE
   V_ZITPLEKKEN_W number;
   V_ZITPLEKKEN_T number;
   V_TREIN_NAAM varchar(100); */
BEGIN

   -- Haal zitplaatsen wagon op
--  SELECT ZITPLEKKEN, TREIN_NAAM_FK INTO V_ZITPLEKKEN_W, V_TREIN_NAAM FROM WAGON WHERE NAAM = :OLD.NAAM;
   -- Verhoog zitplekken trein
   UPDATE TREIN SET ZITPLEKKEN = ZITPLEKKEN + :OLD.ZITPLEKKEN WHERE NAAM = :OLD.TREIN_NAAM_FK;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...