Oracle插入触发器

时间:2012-02-26 01:38:36

标签: oracle triggers insert

我想在表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)
    );

请帮忙。

1 个答案:

答案 0 :(得分:0)

您的触发器不会按原样编译,因为您使用=代替:=进行分配。当你创建触发器时,应该说它已经编译了错误,如果你做show errorsshow 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;
/