sql - 我如何访问由触发器更新的值?

标签 sql oracle plsql database-trigger

这是由序列生成并通过 ACCOUNT_NUMBER_TRIG 触发器插入 ACCOUNTS 表中的 ACCOUNT_NUMBER 值,我需要通过触发器 ACCOUNTS_TRANSCATION_TRIG_1 将其插入到 TRANSACTION TABLE 中

CREATE OR REPLACE TRIGGER ACCOUNT_NUMBER_TRIG
  BEFORE INSERT 
  ON ACCOUNTS
  FOR EACH ROW
  WHEN (NEW.ACCOUNT_NUMBER is not null)
DECLARE
  V_ACC_NO ACCOUNTS.ACCOUNT_NUMBER%TYPE;
BEGIN
  SELECT ACCOUNT_NO_SEQ.nextvaL INTO V_ACC_NO FROM DUAL;
  :NEW.ACCOUNT_NUMBER := V_ACC_NO;

END ACCOUNT_NUMBER_TRIG;

------------------------------------------------------------------------------

CREATE OR REPLACE TRIGGER ACCOUNTS_TRANSCATION_TRIG_1 AFTER
  INSERT ON ACCOUNTS FOR EACH ROW DECLARE CURSOR ACCOUNTS_CUR IS
  SELECT ACCOUNT_NUMBER FROM ACCOUNTS;
  DECLARE 
  TEMP_1 NUMBER(5,0);
  BEGIN
  SELECT ACCOUNTS.ACCOUNT_NUMBER FROM INSERTED INTO TEMP_1
    OPEN ACCOUNTS_CUR;
    INSERT
    INTO TRANSACTIONS VALUES
      (
         SYSDATE,
      - :NEW.ACCOUNT_NUMBER,
        'NEW ACCOUNT',
        0
      );
    CLOSE ACCOUNTS_CUR;
  END ACCOUNTS_TRANSCATION_TRIG_1;

最佳答案

CREATE TABLE accounts(
   ACCOUNT_NUMBER number,
   ACCOUNT_NAME varchar2(20)
);

CREATE SEQUENCE ACCOUNT_NO_SEQ;


CREATE OR REPLACE TRIGGER ACCOUNT_NUMBER_TRIG
  BEFORE INSERT 
  ON ACCOUNTS
  FOR EACH ROW
  WHEN (NEW.ACCOUNT_NUMBER is not null)
BEGIN
  :NEW.ACCOUNT_NUMBER :=ACCOUNT_NO_SEQ.nextvaL;
END ACCOUNT_NUMBER_TRIG;
/

CREATE TABLE transactions(
  TR_DATE  date,
  TR_ACCOUNT_NUMBER number,
  TR_TYPE varchar2(20),
  TR_somenumber int
);

CREATE OR REPLACE TRIGGER ACCOUNTS_TRANSCATION_TRIG_1 AFTER
  INSERT ON ACCOUNTS FOR EACH ROW 
  BEGIN
    INSERT INTO TRANSACTIONS( TR_DATE, TR_ACCOUNT_NUMBER, TR_TYPE, TR_somenumber )
    VALUES
      (
         SYSDATE,
        :NEW.ACCOUNT_NUMBER,
        'NEW ACCOUNT',
        0
      );
  END ACCOUNTS_TRANSCATION_TRIG_1;
  /

INSERT INTO accounts( ACCOUNT_NUMBER, ACCOUNT_NAME ) VALUES (1111,'My Name' );

select * from  accounts;
ACCOUNT_NUMBER ACCOUNT_NAME        
-------------- --------------------
             2 My Name  

select * from transactions;
TR_DATE    TR_ACCOUNT_NUMBER TR_TYPE              TR_SOMENUMBER
---------- ----------------- -------------------- -------------
2017/07/11                 2 NEW ACCOUNT                      0

关于sql - 我如何访问由触发器更新的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041815/

相关文章:

sql - 规范化逗号分隔的外键

sql - 触发插入旧值-已更新的值

sql - 按计数过滤的查询

java - executeUpdate() 总是返回 1

plsql - 生成开始日期和结束日期之间的日期

plsql - PL/SQL block - 简单地查看输出? [我确信这是一个非常简单的问题!]

c# - 为什么 Linq 忽略我的 where 子句?

sql - 使用 EXCEPT,其中 1=0

sql - 将大字符串值设置为 CLOB 时抛出 "PLS-00172: string literal too long"错误

database - 在 PL/SQL 中创建触发器抛出编译错误