【问题标题】:Oracle Pl/SQL: Trigger after insert on Table1 calling a function for Table2?Oracle Pl/SQL:在 Table1 上插入后触发,为 Table2 调用函数?
【发布时间】:2011-11-22 20:22:37
【问题描述】:

我对 Oracle PL/SQL 比较陌生,所以我不确定是否可以这样做:

两个表——T1和T2——T1.id是外键引用T2.id,每个表都有一个序列; 我编写了一个函数,当它被调用时,允许用户在 T1 中插入新行 - 将其称为 func1,与 T2 相同 - func2; 还有一个函数可以让我们获得表中最后插入的序列 - getLastSeq(table);

所以,现在我尝试在 T2 上的插入调用 func1 后创建一个触发器,允许用户编写输入信息。

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

但是我所有可能的尝试都因错误而失败,因为 :col1 不是一个错误的绑定变量。

【问题讨论】:

    标签: oracle plsql triggers


    【解决方案1】:

    我不太确定我是否理解您要完成的工作。

    1. 如果您正在创建一个插入行的 PL/SQL 块,那实际上应该是一个过程,而不是一个函数。函数应该执行计算并返回结果。一个过程应该做DML。
    2. 我不确定您所说的“允许用户编写输入信息”是什么意思。 PL/SQL 没有提示用户输入的功能——它只能接受输入参数。
    3. 我不确定我是否理解向父表 (T2) 中的插入如何能够在逻辑上将行插入到子表 (T1) 中。这意味着 T1 并不是真正的子表,这意味着您的数据模型存在某种问题。

    如果您的目标是将刚刚插入T2 的行中新插入的COL1COL2 表传递给PROC1 过程,我猜你想要类似的东西

    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:
    

    【讨论】:

    • 我会试着解释一下:我有两张桌子。当我使用过程在其中一个表中插入新信息时,我需要使用另一个过程在另一个表中插入信息。例如 - 我们插入一个新订单,在插入有关它的数据后,我需要插入一些保存在另一个表中的附加信息,该信息也从其他表中获取信息。关于用户输入(我没有正确地用这个词),我的意思是使用绑定变量调用过程。
    • @Izumi - 通常,如果您要将数据插入到第二个表中,您只需在过程中调用两次 INSERT
    • 通常 - 是的,我只是想提出一些更有趣的触发器,这就是为什么我想有两个过程,在其中一个完成后,它会激活一个调用另一个的触发器过程。
    【解决方案2】:

    你的触发器语法全错了。

    通读此链接,您可以更好地了解 Oracle 触发器以及一些您可以学习的好示例。

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多