【问题标题】:Trigger in Oracle 10gOracle 10g 中的触发器
【发布时间】:2011-07-28 07:38:08
【问题描述】:

我有一个关系,其中 Account,Client 是两个与 cl_ac 关系相关的表。帐户具有 ac_id 和客户端具有 c_id 作为主键,这两个相同的键在 cl_ac 表中作为外键。我在帐户(ac_id)和客户端(c_id)中有一个主键触发器,因此在两个表中我只需要插入剩余的值,并且主键会为每条记录自增。现在我想要一个触发器,当我在帐户和客户端中插入值时,它会自动在“cl_ac”表中插入值。

或者其他不违反外键约束的触发选项。

我尝试了很多选项,但无法在 cl_ac 表中一次插入 2 个值(c_id 和 ac_id)。请有人帮助我。如果我能插入一张图片以便更好地理解,那就更好了,我希望我已经用可以理解的语言提出了我的问题。

谢谢。

【问题讨论】:

  • 您的意思是每当插入新客户时,您都希望将其与所有帐户关联,反之亦然?如果你这样做,会使 cl_ac 表变得相当多余。

标签: oracle oracle10g


【解决方案1】:

也许您需要使用RETURNING 来获取要插入的两个值,而不是触发器?

INSERT INTO account (ac_id,....) VALUES(seq_ac_id.NEXTVAL,....) RETURNING ac_id INTO return_account_id;
INSERT INTO client  (c_id,....) VALUES(seq_c_id.NEXTVAL,....) RETURNING c_id INTO return_client_id;
INSERT INTO relationship (ac_id,c_id) values(return_account_id, return_client_id);
COMMIT;

【讨论】:

    【解决方案2】:

    触发器如何知道哪个帐户与哪个客户关联?

    您最好从创建帐户/客户记录的代码中插入关系记录。这就是您获得必要信息的地方。

    【讨论】:

      【解决方案3】:

      你可能想把东西包装在一个过程中,有点像下面的伪代码

      CREATE OR REPLACE PACKAGE BODY cli_acc IS
        TYPE tab_cli IS TABLE OF client%ROWTYPE;
        TYPE tab_acc IS TABLE OF account%ROWTYPE;
        PROCEDURE ins_cli_acc (i_tab_cli tab_cli, i_tab_acc tab_acc) IS
        BEGIN
          --insert all of i_tab_cli into CLIENT
          --insert all of i_tab_acc into ACCOUNT
          FOR i IN i_tab_cli.FIRST .. i_tab_cli.LAST LOOP
            FOR j IN i_tab_acc.FIRST .. i_tab_acc.LAST LOOP
               INSERT INTO cli_acc (cli_id, acc_id) 
               VALUES (i_tab_cli(i).cli_id, i_tab_acc(j).acc_id);
            END LOOP;
          END LOOP;
        END ins_cli_acc;
      END cli_acc;
      

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 1970-01-01
        • 2014-06-19
        • 2012-04-04
        • 1970-01-01
        • 2011-04-01
        • 2017-12-03
        • 2020-07-15
        • 2010-12-17
        相关资源
        最近更新 更多