2013-11-21 4 views
0

мне нужно вставить «REGIST» в Историческом таблице данных, когда я вставляю что-то в «ALUGUER» триггер должен вставить одну строку в «HISTÓRICO»:Trigger для вставки после

Мой Trigger:

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

Нет ВЫБРАТЬ требуется, просто обратитесь к :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; 

не допускается. Кроме того, это не имеет смысла, так как на выбор нет предложения 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

Смежные вопросы