【问题标题】:Oracle Trigger: Insert into Transaction Entity New Row Upon Update, Insert of Account EntityOracle触发器:更新时插入事务实体新行,插入帐户实体
【发布时间】:2018-10-23 04:44:14
【问题描述】:

我是 SQL 新手,我很难设置这个触发器。它用于银行控制台 JDBC 之类的东西。

我有一个包含 USER、ACCOUNT 和 TRANSACTION 这三个实体的架构。我想通过在我的事务实体中插入一个新行来跟踪用户对她的一个帐户所做的所有更改,该实体具有

  1. id,我正在处理一个序列,

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

  3. account_id(引用账户实体的主键),
  4. 时间戳,(为此我使用 Oracle 的 CURRENT_TIMESTAMP 函数),
  5. 以及交易类型,可以是“存款”或“取款”。

这是我的触发器现在的样子。

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;
/

任何指导将不胜感激

【问题讨论】:

  • 请描述您当前的代码有什么问题。有任何错误信息吗?

标签: oracle jdbc plsql triggers database-trigger


【解决方案1】:

这样的事情可能会完成这项工作:

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;
/

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

【讨论】:

  • 太棒了!谢谢@Littlefoot!
猜你喜欢
  • 2020-12-10
  • 2017-02-01
  • 1970-01-01
  • 2013-07-01
  • 2017-06-26
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多