简体   繁体   English

在Postgresql中用语法错误在“ LANGUAGE”附近创建我的第一个触发器

[英]Creating my first trigger in Postgresql with syntax error near “LANGUAGE”

I need to learn more about postgres but I am trying to write a function that links to a trigger in my postgres db. 我需要了解有关postgres的更多信息,但是我正在尝试编写一个链接到postgres db中的触发器的函数。 Normally the functions I write work fine, however, this particular function keeps returning errors around the syntax at the end of my output. 通常,我编写的函数可以正常工作,但是,此特定函数使输出末尾的语法始终返回错误。

I have a fixtures table with a column called 'Result'. 我有一个带有“结果”列的灯具表。 I want to read the scores from the fixture eg Wolves 0:0 Ipswich, and trigger into Result 'Draw'. 我想从固定装置中读取比分,例如狼0:0伊普斯维奇,然后触发结果“平局”。

The query I am writing is as follows: 我正在编写的查询如下:

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();

I have only written basic functions before but I am really struggling with getting this trigger to work. 我以前只写过基本功能,但是我真的很难使这个触发器起作用。

You seem to be using IF when you mean ELSIF . 您的意思是ELSIF时似乎正在使用IF This version compiles; 该版本编译;

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 . 快速SQLfiddle进行测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM