2011-11-22 55 views
0

我對Oracle PL/SQL相當陌生,所以我不確定是否可以這樣做:Oracle Pl/SQL:在Table1上插入後觸發,爲Table2調用函數?

兩個表 - T1和T2 - T1.id是外鍵引用T2.id,每個表都有一個序列; 我寫了一個函數,當它被調用時允許用戶在T1中插入新行 - 將其稱爲func1,對於T2-func2也是如此; 也是一個函數,讓我們在表中最後插入的序列 - getLastSeq(table);

所以,現在我試圖創建觸發器後T2插入調用FUNC1,允許用戶寫入輸入信息。 COL1不是一個壞的綁定VAR:

CREATE OR REPLACE TRIGGER trig1 
AFTER INSERT ON T2 
DECLARE 
-----?---- 
BEGIN 
----?---- 
dbms_output.put_line(func1(:col1, :col2)); 
----?----? 
END; 

但所有我可能試圖與有關錯誤做模具等。

回答

2

我不太清楚,我明白你要完成什麼。

  1. 如果你正在創建一個插入一行的PL/SQL塊,那真的應該是一個過程,而不是一個函數。函數應該執行計算並返回結果。一個程序應該做DML。
  2. 我不確定你的意思是「允許用戶寫入輸入信息」。 PL/SQL沒有提示用戶輸入的設施 - 它只能接受輸入參數。
  3. 我不知道,我知道如何插入到父表(T2)所能邏輯行插入一個子表(T1)。這意味着T1不是一個真正的子表,這意味着你對數據模型有某種問題。

如果你的目標是通過從剛插入T2PROC1程序行新插入的COL1COL2表,我的猜測是,你要像

CREATE OR REPLACE TRIGGER trig_t2 
    AFTER INSERT ON t2 
    FOR EACH ROW 
BEGIN 
    proc1(:new.col1, :new.col2); 
END; 

這聽起來但是,就像你可能根本不想使用觸發器一樣。如果要創建訂單,通常會執行多個INSERT語句的過程,而不是嘗試從父級觸發器插入到子表中。例如,像這樣的事情,比基於觸發器的解決方案要更清晰和容易維護。

CREATE OR REPLACE PROCEDURE create_order(p_order_description IN VARCHAR2) 
AS 
BEGIN 
    INSERT INTO order(order_id, description) 
    VALUES(order_id_seq.nextval, p_order_description); 

    INSERT INTO order_ship_status(order_ship_status_id, order_id, status) 
    VALUES(order_ship_status_id.nextval, order_id_seq.currval, 'Not Shipped'); 
END: 
+0

我會盡力解釋:我有兩張表。當我在其中一個表中插入新信息時,使用過程,我需要使用另一個過程將信息插入另一個表中。例如 - 我們插入一個新的訂單,並且在我插入了關於它的數據之後,我需要插入另一個表中保存的其他信息,這些信息也從其他表中獲取信息。 關於用戶輸入(我沒有正確說出這個),我的意思是用綁定變量調用過程。 – Izumi

+0

@Izumi - 通常,如果您要將數據插入到第二個表中,則只需在該過程中執行兩次「INSERT」調用即可。 –

+0

通常 - 是的,我只是試圖想出一些更有趣的觸發器,這就是爲什麼我認爲有兩個過程,並且在其中一個過程完成之後,它會激活一個調用其他過程的觸發器。 – Izumi

相關問題