在Oracle 10g中触发

时间:2011-07-27 12:33:27

标签: oracle oracle10g

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

或者另一个选项而不是违反外键约束的触发器。

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

谢谢。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您可能希望将事物包装在一个过程中,类似于下面的伪代码

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;