2016-10-17 4 views
0

初めてトリガー、ケース、および存在を使用していますが、問題を把握することはできません。私はテーブル名をレスポンダの利便性のための属性に置き換えました。新しいエントリの主キーが既に一時テーブルに存在するならば、私は、Postgres構文エラー - トリガー

  • を私の一時的なテーブルにエントリを挿入すると、私はこの新しいエントリの開始日をしたい:私がしたいことということです基本的に

    、前のレコードの終了日である。

  • 新しいエントリがテーブルに対して完全に新しい場合、何も起こりません(挿入は通常どおり動作します)。

コードは次のとおりです。

CREATE OR REPLACE FUNCTION update_End_Date() 
    RETURNS trigger AS 
$$ 
BEGIN 

    SELECT CASE 
    WHEN EXISTS (SELECT TemporalTable.primaryKey FROM TemporalTable WHERE primaryKey = NEW.primaryKey) 
    THEN 
     UPDATE 
      TemporalTable 
    SET 
     TemporalTable.DtEnd = NEW.DtStart 
    WHERE 
     TemporalTable.PrimaryKey = NEW.PrimaryKey AND 
     TemporalTable.DtEnd IS NULL 
     ; 
    END 

    RETURN NEW; 
RETURN NEW; 
END; 

$$ 
LANGUAGE 'plpgsql'; 


CREATE TRIGGER update_End_Date 
    BEFORE INSERT 
    ON Table1 
    FOR EACH ROW 
    EXECUTE PROCEDURE update_End_Date(); 
+0

あなたは何の問題がありますか?エラーはありますか?その場合は、エラーの詳細を入力します。 – Nicarus

答えて

0

あなたはSELECT文のCASE句の使用に関して概念的なエラーを持っている:あなたは、選択リストのための出力を生成するために、いくつかの条件を評価します。代わりに、Cのような手続き型言語の場合と同じように、ロジック分岐演算として使用します。トリガーは、常に次のように簡単にトリガ機能を書き換えることができplpgsql手続き言語で書かれているので:いくつかのデータが存在する場合、すべてのデータを返さずに

CREATE OR REPLACE FUNCTION update_End_Date() RETURNS trigger AS $$ 
BEGIN 
    PERFORM * FROM TemporalTable WHERE primaryKey = NEW.primaryKey; 
    IF FOUND THEN 
     UPDATE TemporalTable 
     SET DtEnd = NEW.DtStart 
     WHERE PrimaryKey = NEW.PrimaryKey AND DtEnd IS NULL; 
    END IF; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

PERFORMコマンドのチェックをしてtrueFOUND暗黙の変数を設定したりfalseを確認してください。

これがトリガー機能のすべてのロジック(つまり、ここに表示されていない部分はありません)の場合、チェックを外してストレートUPDATEを実行してください:何も起こりませんトリガー機能は単に続行します:

CREATE OR REPLACE FUNCTION update_End_Date() RETURNS trigger AS $$ 
BEGIN 
    UPDATE TemporalTable 
    SET DtEnd = NEW.DtStart 
    WHERE PrimaryKey = NEW.PrimaryKey AND DtEnd IS NULL; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
関連する問題