在更新一个表中的列时,如何通过触发器更新多个表?

时间:2015-03-05 18:33:07

标签: oracle plsql triggers

我在Oracle数据库10g中有两个表。我想通过更新base_information表中的余额来更新两个表中的余额。

我想使用触发器执行此操作,但我无法理解如何才能执行此操作。

表1:

Create TABLE Base_information
(
  account_no varchar2(40) primary key
    check(REGEXP_LIKE(account_no, '[A-Za-z][0-9]{13}')),
  first_name varchar2(25) unique not null
  last_name varchar2(25), 
  address varchar2(40) not null, 
  contact_no varchar2(15) not null
    check(REGEXP_LIKE(contact_no, '[+][0-9]{13}')), 
  code varchar2(20) , 
  balance double precision, 
  online_account varchar2(15)   
);

表2:

Create TABLE User_table
(
  account_no varchar2(40)
    check(REGEXP_LIKE(account_no, '[A-Za-z][0-9]{13}')),
  balance double precision,
  transfer_to varchar2(40)
    check(REGEXP_LIKE(transfer_to , '[A-Za-z][0-9]{13}')),
  transfered_amount double precision,
  transfer_date Timestamp,
  user_id varchar2(20),
  CONSTRAINT rfk1 foreign key(user_id) references Login_table (user_id),
  CONSTRAINT rfk2 foreign key(account_no) references Base_information(account_no)
);

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如其他人所说,最好在两个单独的陈述中做到这一点 无论如何,如果你仍然对如何以这种方式做到这一点感兴趣,你可以这样做:

CREATE OR REPLACE TRIGGER COSO_BT
 BEFORE UPDATE
 ON BASE_INFORMATION REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
BEGIN
    if :new.balance != :old.balance
      then 
            update USER_TABLE
               set balance = :new.balance
             where account_no = :new.account_no;
    end if;

END;
/

如您所见,当您更新base_information表时,如果新余额值与旧余额值不同,则user_table表中的余额值将使用相应account_no记录中的新值进行更新。
对不起我的英文。
希望这有帮助!