2016-04-03 10 views
0

postgresについてもっと知る必要がありますが、postgres dbのトリガーにリンクする関数を書こうとしています。しかし、通常、関数がうまく動作しますが、この特定の関数は、出力の最後に構文を中心にエラーを返し続けます。"LANGUAGE"の近くに構文エラーがあるPostgreSQLで私の最初のトリガーを作成する

私は 'Result'という列のフィクスチャテーブルを持っています。私は器具から得点を読みたいと思います。ウルフ0:0イプスウィッチ、結果「引き分け」にトリガー。

次のように私が書いているクエリは次のとおりです。

CREATE OR REPLACE FUNCTION sppullscoretrigger() 
RETURNS trigger 

SECURITY DEFINER 
AS $BODY$ 

DECLARE 
    payload text; 
BEGIN 
    SELECT NEW.Home_Side_Score, NEW.Away_Side_Score FROM Fixtures; 
     IF NEW.Home_Side_Score is NULL or NEW.Away_Side_Score is NULL THEN NEW.Result = 'TBC'; 
     IF NEW.Home_Side_Score = NEW.Away_Side_Score THEN NEW.Result = 'Draw'; 
     IF NEW.Home_Side_Score > NEW.Away_Side_Score THEN NEW.Result = 'Home_Win'; 
     IF NEW.Home_Side_Score < NEW.Away_Side_Score THEN NEW.Result = 'Away_Win'; 
     ELSE NEW.Result = 'Error'; 
     END IF; 


    RETURN NEW; 
END 
$BODY$ 
LANGUAGE plpgsql 

CREATE TRIGGER trgscore 
BEFORE INSERT OR UPDATE 
ON Fixtures 
FOR EACH ROW 
EXECUTE PROCEDURE sppullscoretrigger(); 

私は前に基本的な機能を書かれているが、私は本当に仕事に、このトリガーを取得して苦労しています。

+1

トリガー機能の後に(そして 'create trigger'の前に)'; 'がありません。また、 'SELECT NEW.Home_Side_Score、NEW.Away_Side_Score FROM Fixtures;は' fixtures'テーブルからすべての***行を選択しますが、各行に対して一定の値を持ちます。選択する必要はありません。行レベルのトリガでは、単に 'new'と' old'レコードにアクセスすることができます –

+0

ありがとうございます。私は不足しているセミコロンを入れました。問題を解決したのは、ヨアヒムのELSIF問題でした。 – LemusThelroy

+0

データを挿入するときにこのトリガを使用しようとしましたが、「エラー:レコード '新規」フィールドに' home_side_score 'というコンテキストがありません。 。" 何か案は?私は新しい属性が私がインポートするデータを保持すると思ったので、フィールドhome_side_scoreなどがあります。 – LemusThelroy

答えて

1

ELSIFを意味すると、IFが使用されているようです。このバージョンはコンパイルされます。

CREATE OR REPLACE FUNCTION sppullscoretrigger() 
RETURNS trigger 

SECURITY DEFINER 
AS $BODY$ 

DECLARE 
    payload text; 
BEGIN 
    SELECT NEW.Home_Side_Score, NEW.Away_Side_Score FROM Fixtures; 
     IF NEW.Home_Side_Score is NULL or NEW.Away_Side_Score is NULL THEN NEW.Result = 'TBC'; 
     ELSIF NEW.Home_Side_Score = NEW.Away_Side_Score THEN NEW.Result = 'Draw'; 
     ELSIF NEW.Home_Side_Score > NEW.Away_Side_Score THEN NEW.Result = 'Home_Win'; 
     ELSIF NEW.Home_Side_Score < NEW.Away_Side_Score THEN NEW.Result = 'Away_Win'; 
     ELSE NEW.Result = 'Error'; 
     END IF; 

    RETURN NEW; 
END 
$BODY$ 
LANGUAGE plpgsql 

A quick SQLfiddle to test with

+0

データを挿入するときにこのトリガを使用しようとしましたが、「エラー:レコード '新規」フィールドに' home_side_score 'というコンテキストがありません。 。" 何か案は?私は、新しい属性が私がインポートしているデータを保持すると思ったので、フィールドhome_side_scoreなどがあります。 – LemusThelroy

関連する問題