2016-06-15 2 views
0

Я пытаюсь создать триггер, который копирует значение из одного столбца («нотубы» в другой («notubesleft») той же таблицы при добавлении новой строки. . скомпилирован правильно, но когда я вставить новую строку, он выдает ошибкуSQL-скрипт правильно компилируется, но вызывает ошибку

Мой триггер:

create or replace TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
AFTER INSERT ON SAMPLES FOR EACH ROW BEGIN 
update samples 
set notubesleft = (select notubes from samples where sampleid = :new.sampleid); 
END; 

при попытке совершить новую строку, я получаю ошибку:

One error saving changes to table "APEX_WS_PROMETHEUS"."SAMPLES":
Row 10: ORA-04091: table APEX_WS_PROMETHEUS.SAMPLES is mutating, trigger/function may not see it
ORA-06512: at "APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER", line 2 ORA-04088: error during execution of trigger 'APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER'
ORA-06512: at line 1

Я прошу нового q потому что я мог найти решения о том, как структурировать PL/SQL-код триггера, но я не могу понять, почему он не работает.

Спасибо.

+0

Почему вы пытаетесь сделать это с помощью триггера после-вставки? –

+0

Поскольку я думал, что мне сначала нужно вставить значения в таблицу, прежде чем использовать их для заполнения другого столбца. Это мой первый триггер. – Matte

ответ

1

Вы не можете (легко) запросить таблицу вы вставив в с row- триггер уровня. Но вы не должны вообще запрашивать таблицу, и не должны использовать триггер after-insert для этого. Вместо этого используйте триггер перед вставкой; вы можете получить и установить значение от :NEW pseudorecord:

CREATE OR REPLACE TRIGGER NOTUBESLEFT_INSERT_TRIGGER  
BEFORE INSERT ON SAMPLES FOR EACH ROW 
BEGIN 
    :new.notubesleft := :new.notubes; 
END; 
+0

Это работает как шарм! Благодаря тонну – Matte

0

Вы столкнулись с проблемой мутирующего стола. Существует ограничение, что вы не можете запросить таблицу, которая мутирует в ДЛЯ КАЖДОЙ СТРОКЕ триггером

Trigger Restrictions on Mutating Tables

If you must update a mutating table, you can bypass these restrictions by using a temporary table, a PL/SQL table, or a package variable. For example, in place of a single AFTER row trigger that updates the original table, resulting in a mutating table error, you might use two triggers—an AFTER row trigger that updates a temporary table, and an AFTER statement trigger that updates the original table with the values from the temporary table.

+0

Благодарим вас за помощь. Я также задаюсь вопросом, правильно ли используется FOR EACH ROW. Моя цель - запустить триггер для вставки новой строки. Я ожидаю, что пользователи будут вставлять только одну строку за раз. – Matte

Смежные вопросы