2012-02-26 7 views
0

私はテーブルの値を検索するためのトリガーを実装しようとしています。条件をチェックして別のテーブルに挿入します。私はのsqldeveloperソフトウェアをコンパイルしようとすると、このエラーがスローされますトリガーでループする

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; 

ORA-01008: Not all variables bound. 

私は、観測の右にある変数を参照しているか?トリガーは、次のようになりますか

+0

(http://stackoverflow.com/questions/9455690/trigger-condition-in-all-rows) –

答えて

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

[すべての行でトリガ条件]の可能複製、私はテーブルOVE検索することができる方法の任意の提案突然変異トリガーエラーなしで? – Nausikaa

+0

@Nausikaa - 以前の質問で示唆したように、挿入を行い、挿入プロセスの一部としてクエリを実行するコードをトリガに入れるのではなく、プロシージャを作成します。しかし、確実にトリガーが必要な場合は、3つのトリガーと1つのパッケージ内のコレクションを使用して、突然変異トリガーエラーを回避するという例を掲載しました。 –

関連する問題