2017-07-11 3 views
2

ここにシーケンスによって生成され、私はあなたが取得するCURVALを使用することができますトリガーによって更新されている値にはどうすればアクセスできますか?

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

column_triggerのようなトリガによって更新または挿入された列を追加しようとしましたか?トリガーが動作しているときは、この列を更新または挿入します(1またはtrue)。 –

+0

これは、更新された列の値を含む新しいレコードを挿入する必要があることです。 – Castro94

答えて

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

それは働いた!ありがとうございました – Castro94

1

トリガACCOUNTS_TRANSCATION_TRIG_1によってトランザクションテーブルに挿入する必要がACCOUNT_NUMBER_TRIGトリガによってテーブルが口座に挿入されたACCOUNT_NUMBERの値ですNEXTVALによって返された最新の値:ACOUNT_NUMBERを設定するために使用されているよう

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; 

ただし、この場合には必要はありません。

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; 

(句が間違っているとき、私は疑う - nullであるときでなければなりません?)

+1

beforeトリガーがsequence_valueをaccount_number列に入れているため、この場合はシーケンスcurrvalにアクセスする必要はありません。 –

+0

@JeffreyKemp良い点 - 答えが更新されました。 –

関連する問題