Oracle 插入后的触发器

Oracle 插入后的触发器,oracle,plsql,Oracle,Plsql,我需要在历史数据表中插入“regist”,当我在“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_ALUG

我需要在历史数据表中插入“regist”,当我在“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错误:
ORA-04091:BDDAD_DL1.ALUGUER表正在变异,触发器可以 不读取或修改
ORA-06512:在第6行“BDDAD\u DL1.添加历史记录”处
ORA-04088:执行触发器“BDDAD_DL1.ADD_HISTORICO”时出错 409100000 -. “表%s%s正在变化,触发器/函数可能看不到它”
*原因:触发器(或在
此语句)试图查看(或修改)表格que was
在被修改的语句中被修改的中间。 *操作:重写触发器(或函数),使其不读取该表


无需选择,只需参考触发器中的
: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;

无需选择,只需参考触发器中的
: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;

无需选择,只需参考触发器中的
: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;

无需选择,只需参考触发器中的
: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;

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

   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 );

我建议您从触发触发器的表中读取您试图读取的记录。这是一个禁忌。所以,这个代码:

   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 );

我建议您从触发触发器的表中读取您试图读取的记录。这是一个禁忌。所以,这个代码:

   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 );

我建议您从触发触发器的表中读取您试图读取的记录。这是一个禁忌。所以,这个代码:

   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 );

我建议您阅读

谢谢您抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这很有帮助。