2013-11-21 65 views
0

我需要在历史数据表中插入“记数”,当我插入“ALUGUER”的东西触发器应在“HISTORICO”插入一行:触发用于插入后

下了扳机:

create or replace 
trigger ADD_HISTORICO 
AFTER INSERT 
    ON ALUGUER 
    FOR EACH ROW 

DECLARE 
    cod_aluguer_p NUMBER(6,0); 
    cod_veiculo_p NUMBER(6,0); 
BEGIN 

    SELECT ID_ALUGUER INTO cod_aluguer_p 
    FROM ALUGUER; 
    SELECT COD_VEICULO INTO cod_veiculo_p 
    FROM ALUGUER; 

    INSERT INTO HISTORICO(ID_ENTRADA,DESCRICAO,DATA_REGISTO,NOVO_VEICULO,NOVO_ALUGUER) 
    VALUES(SEQ_HISTORICO.nextval,'NOVA DESCRIÇÃO','21/11/2013',cod_veiculo_p,cod_aluguer_p); 

END; 

错误报告:

SQL Error:
ORA-04091: BDDAD_DL1.ALUGUER table is mutating, trigger can not read or modify
ORA-06512: at "BDDAD_DL1.ADD_HISTORICO", line 6
ORA-04088: error during execution of trigger 'BDDAD_DL1.ADD_HISTORICO' 04091. 00000 -. "Table% s% s is mutating, trigger/function may not see it"
* Cause: A trigger (or a user defined plsql function that is referenced in
            this statement) attempted to look at (or modify) a table que was
            in the middle of being modified by the statement Which fired it.
* Action: Rewrite the trigger (or function) so it does not read that table.

回答

1

没有SELECT是必需的,只是指:NEW值触发。此外,您还可以使用TRUNC(SYSDATE),以获取当前日期假设这是你的原意:

create or replace 
trigger ADD_HISTORICO 
AFTER INSERT 
    ON ALUGUER 
    FOR EACH ROW 

BEGIN 

    INSERT INTO HISTORICO(ID_ENTRADA,DESCRICAO,DATA_REGISTO, 
      NOVO_VEICULO,NOVO_ALUGUER) 
    VALUES(SEQ_HISTORICO.nextval,'NOVA DESCRIÇÃO', 
      TRUNC(SYSDATE),:NEW.COD_VEICULO ,:NEW.ID_ALUGUER); 

END; 
+0

谢谢您的时间。它帮助了很多。 – Vyward

2

您正在试图读取该触发器已被触发的表中的记录。这是一个禁忌。所以,这个代码:

SELECT ID_ALUGUER INTO cod_aluguer_p 
    FROM ALUGUER; 
    SELECT COD_VEICULO INTO cod_veiculo_p 
    FROM ALUGUER; 

是不允许的。此外,它没有任何意义,因为select中没有WHERE子句,因此将返回所有行。模糊点,因为无论如何您都无法做到这一点。你想要做的是引用:触发行的新值istead。例如:

cod_aluguer_p := :new.ID_ALUGUER ; 
    cod_veiculo_p L= :NEW.COD_VEICULO; 

此外,您甚至不需要这些局部变量,只需使用:new直接。

INSERT INTO HISTORICO(ID_ENTRADA,DESCRICAO,DATA_REGISTO,NOVO_VEICULO,NOVO_ALUGUER) 
    VALUES(SEQ_HISTORICO.nextval,'NOVA DESCRIÇÃO','21/11/2013',:NEW.COD_VEICULO,:new.ID_ALUGUER); 

我会推荐阅读Oracle docs on triggers

+0

谢谢你的时间。它帮助了很多。 – Vyward