Oracle触发器:更新后插入交易实体新行,插入账户实体

时间:2018-10-23 04:44:15

标签: oracle jdbc plsql triggers database-trigger

我是SQL的新手,我很难设置此触发器。这是针对Bank Console JDBC之类的。

我有一个包含三个实体(USER,ACCOUNT和TRANSACTION)的架构。我想通过向我的交易实体插入新行来跟踪用户对其帐户之一所做的所有更改,该交易实体的列为

  1. id,我正在使用序列

  2. 处理
  3. user_id(引用存储在帐户实体中的外键),

  4. account_id(引用帐户实体的主键),
  5. 时间戳记(我正在使用它的Oracle的CURRENT_TIMESTAMP函数)
  6. 和一种交易类型,可以是“存款”或“取款”。

这是我的扳机现在的样子。

CREATE OR REPLACE TRIGGER ADD_TX
ON ACCOUNT
AFTER INSERT, UPDATE
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE old_balance number, new_balance number, transaction_type varchar2(100);
BEGIN
  transaction_type := CASE WHEN :NEW.balance < :OLD.balance THEN 'WITHDRAWAL' ELSE 'DEPOSIT' END;
  INSERT INTO TRANSACTIONS VALUES(TRANSACTION_ID_SEQ.NEXTVAL, :NEW.USER_ID, :NEW.id, CURRENT_TIMESTAMP, :NEW.account_type, transaction_type);
   end if; 
END;
/

任何指导将不胜感激

1 个答案:

答案 0 :(得分:0)

类似的事情可能会起作用:

CREATE OR REPLACE TRIGGER add_tx AFTER
  INSERT OR UPDATE ON account
  FOR EACH ROW
BEGIN
  INSERT INTO transactions VALUES (
    transaction_id_seq.NEXTVAL,
    :new.user_id,
    :new.id,
    current_timestamp,
    :new.account_type,
      CASE
        WHEN :new.balance <:old.balance  THEN 'WITHDRAWAL'
        ELSE 'DEPOSIT'
      END
  );    
END;
/

但是,我建议您命名要插入的所有列;用您编写它的方式,尚不清楚哪个值进入哪一列,这样的代码有一天可能(并且很可能会)中断。