2015-11-05 52 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; 

因此,期函數試圖訪問的TableX在它的身上,我相信這就是問題所在。我希望能夠清除它。

+1

請您詳細說明一下。目前尚不清楚你的具體要求是什麼。你想讓插入的行以不同的方式處理它嗎?如果是的話,你可以使用'RETURNING INTO'子句。看看這裏的例子http://lalitkumarb.com/2015/04/07/returning-the-sequence-number-of-identity-column-after-insert/ –

+0

我不認爲這與什麼有關我試圖以任何方式解釋。我想在插入操作後執行一個函數。但我希望它的插入操作和觸發器不以原子方式執行。我希望首先插入操作,以便我可以在不使用「:new」關鍵字的情況下在表的新狀態(插入新行)上運行函數。我希望這可以讓我更清楚 – Sammy

+1

也許一個例子會更好。如果你可以**編輯你的問題並添加一個測試用例**。我仍然困惑你的流程。桌子上已經有觸發器在做什麼了?什麼是要做的功能? –

回答

-1

您可以創建一個after語句觸發器,該語句觸發器在插入後僅觸發一次。問題是如何識別需要進一步處理的行(理論上這可以是多條記錄)。

可能最簡單的解決方法是向表中添加一列,以指示記錄是否需要進一步處理。

否則,您可以收集包中集合中插入行的PK值,並在after語句觸發器中使用該集合。您將需要:一個包含集合的包,一個用於將PK值放入集合中的行級觸發器,一個使用集合的after語句觸發器。

+0

我根本不需要識別特定的行。我只需要對錶的所有行(包括新插入的行)執行操作。如何創建在插入後僅觸發一次的after語句觸發器? – 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; 

注意避免這個錯誤:你不能使用 「:新建」,在 「AFTER STATEMENT」 身體限制。

「AFTER STATEMENT」下的聲明,您可以選擇,更新並插入tableX。它將爲1條語句做1次。

「每行之前」下的聲明,您無法在tableX中選擇,更新和插入。它會爲每個受影響的行執行1次。