2015-11-06 4 views
2

Как получить доступ к таблице с триггером внутри тела триггера?Доступ к триггерной таблице внутри тела триггера

create or replace trigger insert_try after insert on triggerTable for each row 
begin 
    insert into anotherTable (triggerFunction(:new.field1), 155,155); 
end; 

create or replace function triggerFunction(param1 in number) return number as 
abc number; 
begin 
    select max(field1) into abc from triggerTable where field1!= param1; 
    return abc ; 
end triggerFunction; 

В результате получается «SQLSyntaxErrorException: ORA-04091». Есть ли способ выполнить операцию вставки независимо от триггера и запустить триггер после этого?

+0

Таблица 'triggerTable' мутирует, потому что вы пытаетесь выбрать из таблицы, которая в настоящее время изменяется триггером. –

+0

Итак, как я могу выбрать из этой таблицы? Есть ли работа вокруг или другой подход для достижения того, что я описал? – Sammy

+0

Зачем вам нужна эта функция? Вы могли бы просто использовать ': new.filed1' –

ответ

0

Я не вижу причин использовать функцию, которая запрашивает ту же таблицу, на которой определен триггер. Он ничего не делает, кроме как отправляет :new.field1 в качестве параметра и возвращает то же самое значение.

Поскольку вы уже используете ДЛЯ КАЖДОЙ ROW, вы можете получить доступ к старым и новым значениям, как :old и :new.

CREATE OR REPLACE TRIGGER insert_try 
AFTER INSERT ON triggerTable 
FOR EACH ROW 
BEGIN 
    INSERT INTO anotherTable 
    (:new.field1, 155,155 
    ); 
END; 
/

Это будет просто вставить значение из field1 из triggertable в anothertable.

+0

Проверьте мою отредактированную версию. И вопрос не в том, «как я могу вставить строку в другую таблицу». – Sammy

0

Сделать функцию автономным помощью ргадта AUTONOMOUS_TRANSACTION

  create or replace function triggerFunction(param1 in number) return number as 
      abc NUMBER; 
      pragma autonomous_transaction ; 
      begin 
       select max(field1) into abc from triggerTable where field1!= param1; 
       return abc ; 
      end triggerFunction; 

Затем попробуйте вставить, мутирует ошибку таблицы не придут в этом случае.

+0

Однако вновь вставленная строка все еще недоступна. – Sammy

+0

В вашем предложении where есть поле «field1! = Param1», что означает, что вы получите максимальное значение без недавно вставленной строки. Зачем вам нужен доступ к недавно вставленной строке? –

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