2017-07-11 1 views
2

est ici la valeur de ACCOUNT_NUMBER qui a été générée par une séquence et insérée dans tableau des comptes par déclencheur ACCOUNT_NUMBER_TRIG que j'ai besoin pour l'insérer dans la table TRANSACTION par le ACCOUNTS_TRANSCATION_TRIG_1 de déclenchementComment puis-je accéder à une valeur mise à jour par un déclencheur?

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; 
+0

Avez-vous essayé d'ajouter une colonne mise à jour ou insérée par trigger quelque chose comme column_trigger? Lorsque le déclencheur fonctionne, mettez à jour ou insérez cette colonne = 1 ou true. –

+0

La chose est que j'ai besoin d'insérer un nouvel enregistrement qui contient la valeur de la colonne mise à jour – Castro94

Répondre

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 
+0

Ça a marché! JE VOUS REMERCIE – Castro94

1

Vous pouvez utiliser CURVAL pour obtenir le la plus récente valeur retournée par 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; 

Cependant, dans ce cas, il n'y a pas besoin, car il a été utilisé pour définir le ACOUNT_NUMBER:

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

BTW, sauf si vous êtes sur une ancienne version d'Oracle cela devrait fonctionner pour la première détente:

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; 

(je soupçonne que la clause WHEN est faux - devrait être quand est nulle?)

+1

Ne devrait pas avoir besoin d'accéder à la séquence currval dans ce cas, puisque le déclencheur avant a mis la valeur de la séquence dans la colonne account_number. –

+0

@JeffreyKemp Bon point - réponse mise à jour. –