2012-02-26 44 views
0

我試圖實現一個觸發器來搜索表上的值,並且,如果它檢查條件然後插入另一個表中。該觸發看起來是這樣的:在觸發器中循環

TRIGGER DISTANCIA 
AFTER INSERT ON OBSERVACION FOR EACH ROW 
DECLARE 
importe_multa NUMBER (3,0); 
BEGIN 
FOR ROW IN (SELECT fecha_foto, hora_foto, pto_km_radar, sentido_radar, carretera_foto FROM OBSERVACION) LOOP 
    IF((ROW.fecha_foto = :NEW.fecha_foto) 
    AND 
    (ROW.carretera_foto= :NEW.carretera_foto) 
    AND 
    (ROW.pto_km_radar=:NEW.pto_km_radar) 
    AND 
    (ROW.sentido_radar=:NEW.sentido_radar)) 
    THEN 

    IF(ROW.hora_foto<:NEW.hora_foto-3,6/86400) 
    THEN 
    importe_multa:= (:NEW.hora_foto - ROW.hora_foto - 3,6/86400)*100; 
    END IF; 
    IF(:NEW.hora_foto < ROW.hora_foto-3,6/86400) 
    THEN 
    importe_multa:= (ROW.hora_foto - :NEW.hora_foto - 3,6/86400)*100; 
    END IF; 

    IF(importe_multa IS NOT NULL) 
    THEN 
    --Introducimos el valor en el campo. 
    INSERT INTO SANCION(importe, fecha_foto, hora_foto, coche, tipo) 
    VALUES 
    (importe_multa, :NEW.fecha_foto, :NEW.hora_foto, :NEW.coche, '2'); 
    END IF; 
    END IF; 
END LOOP; 
END; 

當我試圖編譯的SQLDeveloper軟件引發此錯誤:

ORA-01008: Not all variables bound. 

難道我引用在觀察右邊的變量?

+0

的[所有行觸發條件(http://stackoverflow.com/questions/9455690/trigger-condition-in-all-rows)可能重複 – 2012-02-26 21:12:04

回答

0

1)OBSERVACION上的行級觸發器不能再查詢OBSERVACION表。如果你這樣做,你會得到一個突變的觸發錯誤。所以這種方法從根本上是有問題的。

2)我想你會得到編譯錯誤,因爲你需要用小數點表示十進制數字作爲分隔符,而不是逗號。逗號用於將參數分隔到一個函數。

3)如果你的確實是想要在觸發器中實現這種邏輯,而不是將它放在真正屬於它的過程中,那麼需要用一系列觸發器解決突變觸發器錯誤。這會讓你的代碼更加複雜,難以遵循,而且更難調試。但它可以讓你只用觸發器來做到這一點。

CREATE OR REPLACE PACKAGE pkg_new_rows 
AS 
    TYPE typ_new_row_array 
    IS TABLE OF rowid; 
    g_new_rows typ_new_row_array; 
END; 

CREATE OR REPLACE TRIGGER trg_before_statement 
    BEFORE INSERT ON OBSERVACION 
DECLARE 
BEGIN 
    pkg_new_rows.g_new_rows := new pkg_new_rows.typ_new_row_array(); 
END; 

CREATE OR REPLACE TRIGGER trg_before_row 
    BEFORE INSERT ON observacion 
    FOR EACH ROW 
DECLARE 
BEGIN 
    pkg_new_rows.g_new_rows.extend; 
    pkg_new_rows.g_new_rows(pkg_new_rows.g_new_rows.count) := :new.rowid; 
END; 

CREATE OR REPLACE TRIGGER trg_after_statement 
    AFTER INSERT ON observacion 
DECLARE 
    l_row observacion%rowtype; 
BEGIN 
    FOR i IN 1 .. pkg_new_rows.g_new_rows.count 
    LOOP 
    SELECT * 
     INTO l_row 
     FROM observacion 
    WHERE rowid := pkg_new_rows.g_new_rows(i); 

    <<implement your logic by querying the other rows of the OBSERVACION table 
    and comparing that to the data in the l_row record>> 
    END LOOP; 
END; 
+0

的我怎麼可以搜索奧雅納表中的所有建議沒有突變的觸發錯誤? – Nausikaa 2012-02-26 21:18:16

+0

@Nausikaa - 正如您在先前的問題中所建議的那樣,創建一個執行插入操作並將查詢作爲插入過程的一部分運行的過程,而不是將代碼放入觸發器中。但是,如果你完全確定你需要觸發器,我發佈了一個使用三個觸發器和一個包中的集合來解決突變觸發器錯誤的例子。 – 2012-02-26 21:32:25