我怎样才能访问由触发器更新的值?

how can i access a value that's being updated by a trigger?

这是 ACCOUNT_NUMBER 的值,它已由序列生成并通过 ACCOUNT_NUMBER_TRIG 触发器插入到帐户 table 中,我需要将其插入到交易中 TABLE 由触发器 ACCOUNTS_TRANSCATION_TRIG_1

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;

您可以使用 CURVAL 获取 NEXTVAL 返回的最新值:

CREATE OR REPLACE TRIGGER ACCOUNTS_TRANSCATION_TRIG_1 AFTER
  INSERT ON ACCOUNTS FOR EACH ROW DECLARE CURSOR ACCOUNTS_CUR IS
  BEGIN
    INSERT
    INTO TRANSACTIONS VALUES
      (
         SYSDATE,
       - ACCOUNT_NO_SEQ.curval,
        'NEW ACCOUNT',
        0
      );
    CLOSE ACCOUNTS_CUR;
  END ACCOUNTS_TRANSCATION_TRIG_1;

然而在这种情况下没有必要,因为它已经被用来设置 ACOUNT_NUMBER:

    INSERT
    INTO TRANSACTIONS VALUES
      (
         SYSDATE,
       - :NEW.ACCOUNT_NUMBER,
        'NEW ACCOUNT',
        0
      );

顺便说一句,除非您使用的是旧版本的 Oracle,否则这应该适用于第一个触发器:

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;

(我怀疑 WHEN 子句是错误的 - 应该是当 null 时?)

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