2015-11-05 1 views
-1

Я хочу выполнить функцию после операции вставки, которая обращается к недавно вставленным данным, вызывая другую функцию. Вот почему я не могу использовать триггер после вставки. Так как внутренняя функция не обращается к данным с помощью «: new». Есть ли способ сначала вставить вставку в зависимости от триггера, а затем выполнить функцию?Функция, которая выполняется после вставки

trigger insert_to_A after insert on tableX for each row 
begin 

    insert into tableA values (function1(:new.field1)); 

end; 


create or replace function function1(abc number) return number as 
begin 

select nvl(field1,-1) 
into nMax1 
from tableX 
where field1= abc; 

end; 

Итак, функция1 пытается получить доступ к таблице X в своем теле, и я считаю, что это проблема. Я надеюсь, что это очистит.

+1

Не могли бы вы рассказать подробнее. Неясно, каково ваше точное требование. Вы хотите, чтобы вставленные строки обрабатывали его по-другому? Если да, вы можете использовать предложение «ВОЗВРАТ В ИНТ». Взгляните на пример здесь http://lalitkumarb.com/2015/04/07/returning-the-sequence-number-of-identity-column-after-insert/ –

+0

Я не думаю, что это имеет отношение к тому, что Я пытался каким-то образом объяснить. Я хочу выполнить функцию после операции вставки. Но я хочу это так, чтобы операция вставки и триггер не выполнялись атомным способом. я хочу сначала выполнить операцию вставки, чтобы я мог запускать функцию в новом состоянии таблицы (с вставленными новыми строками) без использования ключевого слова «: new». Надеюсь, что это станет немного более ясным. – Sammy

+1

Возможно, пример будет лучше. Если вы можете ** изменить свой вопрос и добавить тестовый пример **. Я все еще путаю поток вашего процесса. Триггер уже на столе что-то делает? Какие функции будут делать? –

ответ

-1

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

Возможно, самым простым решением является добавление колонки в таблицу, которая укажет, нуждается ли запись в дальнейшей обработке.

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

+0

Мне не нужно идентифицировать конкретные строки вообще. Мне просто нужно выполнить операцию во всех строках таблицы (включая вновь вставленные строки). Как создать триггер после инструкции, который запускается только один раз после вставки? – Sammy

+0

Почему вам нужно выполнить действие на всей таблице после вставки? Во всяком случае, документация обычно является хорошим началом. http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm – Rene

0

У вас возникли ошибки, такие как «ORA-04091: имя таблицы мутирует»?

Ошибка будет возникать при выборе, вставке или обновлении в той же таблице, которая запускается при запуске.

Вы можете избежать этой ошибки на COMPOUND TRIGGER

CREATE OR REPLACE TRIGGER insert_to_A 
FOR insert on tableX 
COMPOUND TRIGGER 
    AFTER STATEMENT IS 
    BEGIN 
    -- Put your function or statement 
    END AFTER STATEMENT; 

    BEFORE each ROW IS 
    BEGIN 
    -- Put your statement 
    END BEFORE each ROW; 
END insert_to_A; 

Примечание: Вы не можете использовать ": NEW" в "после заявления" тела ограничение.

Утверждения в разделе «ПОСЛЕ ЗАЯВЛЕНИЯ» вы можете выбрать, обновить и вставить в таблицу X. Он будет делать 1 раз для 1 заявления.

Заявления в разделе «ПЕРЕД каждой РЯДОМ» вы не можете выбирать, обновлять и вставлять в таблицуX. Он будет делать 1 раз для каждой затронутой строки.