2017-01-05 1 views
0

私は、この目的のためにトリガーを作成していたが、私は他の2つのフィールド(LATITUDEとLONGITUDE)を挿入/更新する場合にのみ、1つのフィールド(LOCATION)を更新するためにトリガしますか?

テーブルを取得しています、私はそれを使用する場合、トリガー/関数は

やデッドロック警告がそれを見ていないことがあり、変異されています

create or replace TRIGGER fill_coordinates 
    BEFORE UPDATE OR DELETE OR INSERT ON bus_stops 
    FOR EACH ROW 
    WHEN ((NEW.latitude <> OLD.latitude OR NEW.longitude <> NEW.longitude) AND (NEW.longitude IS NOT NULL AND NEW.latitude IS NOT NULL)) 
BEGIN 
    UPDATE BUS_STOPS SET LOCATION = 'test location name' WHERE BUS_STOP_ID = CurrentRowID; 
END; 

LATITUDEフィールドとLONGITUDEフィールドの両方が更新または挿入されていても、同じテーブル内のLOCATIONフィールドを更新しようとしていますが、動作していないようです。そしてCurrentRowIDがどこにあるのかbus_stops.bus_stop_idを使う必要がありますか?

+0

これは、「BUS_STOPSで更新する前に、BUS_STOPSの更新を含むものを実行する」と言っているからです。あなたはこれを行うことはできません。したがってエラーです。 – Utsav

+0

しかし、AFTER更新はテーブル突然変異を引き起こすでしょうか? – JanisOzolins

答えて

3

あなたは、テーブルを更新し、新しい値を割り当てる必要がありません:

create or replace TRIGGER fill_coordinates 
    BEFORE UPDATE OR DELETE OR INSERT ON bus_stops 
    FOR EACH ROW 
    WHEN ((NEW.latitude <> OLD.latitude OR NEW.longitude <> NEW.longitude) AND (NEW.longitude IS NOT NULL AND NEW.latitude IS NOT NULL)) 
BEGIN 
    :new.LOCATION := 'test location name'; 
END; 

しかし、それはDELETEトリガーでこれを行うには意味がありません。おそらく、OR DELETEオプションをトリガー定義から削除する必要があります。

+0

このOracle SQL構文はありますか?このトリガは、次のように返します。_変数のバインドを無効にしました(WHEN句のコロンのため)。また、BEGINとENDの間に=を使用する必要があります。もし私がこれらのものを取り除くと、私はまだ式が間違っている_ – JanisOzolins

+0

@Aleksej:ありがとうBtw: "セミコロン"は ';' ':'はコロンです –

+0

@JanisOzolins:それは私のエラーです側。アレクセイは正しい。 ':'は 'WHEN'条件では無効です。 –

関連する問題