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

时间:2017-07-11 18:12:52

标签: sql oracle plsql database-trigger

这是ACCOUNT_NUMBER的值,它由序列生成并通过ACCOUNT_NUMBER_TRIG触发器插入到ACCOUNTS表中,我需要通过触发器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;

2 个答案:

答案 0 :(得分: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子句是错误的 - 应该在为空时?)

答案 1 :(得分: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