【问题标题】:Oracle Insert Trigger [closed]Oracle 插入触发器 [关闭]
【发布时间】:2012-03-16 00:38:26
【问题描述】:

我想用触发器在表 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)
    );

请帮忙。

【问题讨论】:

  • 您正在插入OBSERVACION,但我们不知道GOTCHA 表中的内容。而且我们不知道插入的任何行是否满足触发器中声明的WHEN 条件。
  • Gotcha 表的格式就是这个。 WHEN 中的条件也满足大约 25.000 次。
  • @NNausikaa - 发布一个我们可以在我们的机器上查看和运行的测试用例。如果满足WHEN 条件,将触发Oracle 触发器。除非您忽略了存在异常或忘记提交或其他您未提及的事实,否则触发器将触发并在SANCION中插入一行@

标签: oracle triggers insert


【解决方案1】:

您的触发器不会按原样编译,因为您使用= 而不是:= 进行赋值。当您创建触发器时,它应该说它已编译错误,如果您执行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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2021-08-25
    • 2014-06-28
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多