2011-11-22 20 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

相关问题