Oracle 插入后的触发器
我需要在历史数据表中插入“regist”,当我在“ALUGUER”中插入某些内容时,触发器应该在“HISTORICO”中插入一行: 我的触发器: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
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 );
我建议您阅读谢谢您抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这帮了大忙。谢谢你抽出时间。这很有帮助。