Я пытаюсь создать триггер, который читает из таблицы 2 и обновляет столбец в таблице 1. Я пытался использовать этот метод, но произошло исключение: ORA-04091: таблица table1 мутирует.
CREATE OR REPLACE TRIGGER "TRG1"
AFTER INSERT OR UPDATE ON table1
FOR EACH ROW
BEGIN
UPDATE table1 SET name =(SELECT name FROM table2
WHERE table1.id = table2.id);
END;
Почему вы дублируете данные по таблицам? Если имя в table2
обновлено, то данные в table1
будут устаревшими — по крайней мере, до тех пор, пока они не будут обновлены по какой-либо другой причине.
Вы можете обновить имя только в триггере перед
CREATE OR REPLACE TRIGGER "TRG1"
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
DECLARE new_name varchar2(100);
BEGIN
SELECT name INTO new_name FROM table2
WHERE :new.id = table2.id;
:new.name :=new_name;
END;
/
МТО было так приятно сделать скрипку
Синтаксис в триггере недействителен, поскольку присваивание равно :=
, и вы не можете использовать оператор SELECT
в PL/SQL без предложения INTO
fiddle.
спасибо я исправил свою ошибку
@nbk Я искренне ценю вашу помощь.
Используйте триггер BEFORE UPDATE
(поскольку вы не можете изменять значения после того, как они были вставлены или обновлены) и используйте запись :NEW
(вместо того, чтобы пытаться обновить таблицу и попасть в бесконечный цикл триггеров):
CREATE OR REPLACE TRIGGER TRG1
BEFORE INSERT OR UPDATE ON table1
FOR EACH ROW
BEGIN
SELECT name
INTO :NEW.name
FROM table2
WHERE :NEW.id = id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
:NEW.name := NULL;
END;
/
Я искренне ценю вашу помощь