2012-02-26 2 views
0

트리거를 사용하여 테이블 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

당신은 OBSERVACION''에 삽입하고 있지만, 우리는 아무 생각이 없다 무엇이'GOTCHA' 테이블에 있는지. 그리고 삽입 된 행 중 어떤 것이 트리거에서 선언 된'WHEN' 조건을 충족시키는 지 알 수 없습니다. –

+0

Gotcha 테이블의 형식이이 것입니다. 또한 WHEN의 상태는 약 25000 번을 충족합니다. – Nausikaa

+0

@NNauskaa - 우리 머신에서보고 실행할 수있는 테스트 케이스를 게시하십시오. 오라클 트리거는'WHEN' 조건이 충족되면 작동합니다. 예외가 있다는 사실을 생략하거나 언급하지 않은 것을 잊어 버리는 경우를 제외하고 트리거가 실행되고'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