我想在表sancion中使用触发器插入行,但在插入后它仍然为空。
第一个引用的表:
CREATE TABLE OBSERVACION(
carretera_foto VARCHAR2(5),
pto_km_radar NUMBER(3,0),
sentido_radar VARCHAR2(3),
fecha_foto VARCHAR2(10),
hora_foto TIMESTAMP(6),
velocidad_foto NUMBER(3,0),
limit_vel_radar NUMBER(3,0),
coche VARCHAR2(7),
CONSTRAINT observacion_pk PRIMARY KEY(fecha_foto, hora_foto, coche),
CONSTRAINT observacion_fk FOREIGN KEY (carretera_foto,pto_km_radar, sentido_radar) REFERENCES Radar (carretera_foto, pto_km_radar, sentido_radar),
CONSTRAINT observacion_matricula_fk FOREIGN KEY(coche) REFERENCES Vehiculo (matricula) ON DELETE SET NULL
);
插入:
`INSERT INTO OBSERVACION(carretera_foto, pto_km_radar, sentido_radar, fecha_foto, hora_foto, velocidad_foto,limit_vel_radar, coche)
SELECT distinct carretera_foto, pto_km_radar, sentido_radar, TO_DATE(fecha_foto, 'YYYY-MM-DD'), hora_foto, velocidad_foto, limit_vel_radar, matricula
FROM gotcha;`
另一张桌子(我希望在这里插入触发器):
CREATE TABLE SANCION(
importe NUMBER(3,0),
fecha_foto VARCHAR2(10),
hora_foto TIMESTAMP(6),
coche VARCHAR2(7),
tipo VARCHAR2(5),
NIFdueno VARCHAR2(35),
CONSTRAINT sancion_pk PRIMARY KEY(fecha_foto, hora_foto, coche, tipo),
CONSTRAINT sancion_duenio_fk FOREIGN KEY (NIFdueno) REFERENCES Persona (NIFpersona),
CONSTRAINT sancion_observacion_fk FOREIGN KEY (fecha_foto, hora_foto, coche) REFERENCES Observacion (fecha_foto, hora_foto, coche)
);
触发器:
CREATE TRIGGER VELOCIDAD
AFTER INSERT ON OBSERVACION FOR EACH ROW
WHEN(NEW.velocidad_foto > NEW.limit_vel_radar)
DECLARE
importe_multa NUMBER(3,0);
BEGIN
importe_multa =(:NEW.velocidad_foto - :NEW.limit_vel_radar)*10;
INSERT INTO SANCION(importe, fecha_foto, hora_foto, coche, tipo)
VALUES
(importe_multa, :NEW.fecha_foto, :NEW.hora_foto, :NEW.coche, '1');
END;
陷阱表:
CREATE TABLE gotcha (
matricula VARCHAR2(7),
VIN VARCHAR2(17),
marca VARCHAR2(10),
modelo VARCHAR2(12),
potencia VARCHAR2(6),
color VARCHAR2(25),
fecha_matricula VARCHAR2(10),
fecha_ITV VARCHAR2(10),
nombre_dueno VARCHAR2(35),
apell_1_dueno VARCHAR2(15),
apell_2_dueno VARCHAR2(15),
direcc_dueno VARCHAR2(42),
ciudad_dueno VARCHAR2(35),
tlf_dueno VARCHAR2(9),
email_dueno VARCHAR2(50),
cumple_dueno VARCHAR2(10),
NIF_dueno VARCHAR2(9),
nombre_condtr VARCHAR2(35),
apell_1_condtr VARCHAR2(15),
apell_2_condtr VARCHAR2(15),
direcc_condtr VARCHAR2(42),
ciudad_condtr VARCHAR2(35),
tlf_condtr VARCHAR2(9),
email_condtr VARCHAR2(50),
cumple_condtr VARCHAR2(10),
NIF_condtr VARCHAR2(9),
carnet_condtr VARCHAR2(3),
fecha_carnet VARCHAR2(10),
edad_condtr NUMBER(2,0),
carretera_foto VARCHAR2(5),
limit_vel_ctera NUMBER(3,0),
pto_km_radar NUMBER(3,0),
sentido_radar VARCHAR2(3),
limit_vel_radar NUMBER(3,0),
fecha_foto VARCHAR2(10),
hora_foto VARCHAR2(12),
velocidad_foto NUMBER(3,0)
);
请帮忙。
答案 0 :(得分:0)
您的触发器不会按原样编译,因为您使用=
代替:=
进行分配。当你创建触发器时,应该说它已经编译了错误,如果你做show errors
或show errors trigger velocidad
,它会告诉你什么是错的。它应该是:
CREATE TRIGGER VELOCIDAD
AFTER INSERT ON OBSERVACION FOR EACH ROW
WHEN (NEW.velocidad_foto > NEW.limit_vel_radar)
DECLARE
importe_multa NUMBER(3,0);
BEGIN
importe_multa := (:NEW.velocidad_foto - :NEW.limit_vel_radar)*10;
INSERT INTO SANCION(importe, fecha_foto, hora_foto, coche, tipo)
VALUES
(importe_multa, :NEW.fecha_foto, :NEW.hora_foto, :NEW.coche, '1');
END;
/
你真的不需要这个任务,你可以直接在插入中进行计算:
CREATE TRIGGER VELOCIDAD
AFTER INSERT ON OBSERVACION FOR EACH ROW
WHEN NEW.velocidad_foto > NEW.limit_vel_radar
BEGIN
INSERT INTO SANCION(importe, fecha_foto, hora_foto, coche, tipo)
VALUES ((:NEW.velocidad_foto - :NEW.limit_vel_radar)*10,
:NEW.fecha_foto, :NEW.hora_foto, :NEW.coche, '1');
END;
/