2012-02-26 17 views
0

トリガーを使用してテーブルsancionに行を挿入したいが、挿入後は空のままである。Oracle挿入トリガー

最初に参照テーブル:

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

あなたはOBSERVACION' 'に挿入しているが、我々は見当がつかない'GOTCHA'テーブルには何が入っていますか?挿入されている行のいずれかがトリガーで宣言された 'WHEN'条件を満たすかどうかはわかりません。 –

+0

Gotchaテーブルのフォーマットはこれです。またWHENの条件は約25000回にも及ぶ。 – Nausikaa

+0

@NNauskaa - 私たちのマシンで見て実行できるテストケースを投稿します。 'WHEN'条件が満たされると、Oracleトリガーが起動します。例外があるという事実を省略している場合や、コミットすることを忘れている場合や、言及していないことを忘れている場合を除き、トリガは発動し、行は「SANCION」に挿入されます –

答えて

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; 
/
+0

あなたの答えをありがとう。 – Nausikaa