2016-04-03 6 views
0

Ich muss mehr über Postgres lernen, aber ich versuche, eine Funktion zu schreiben, die auf einen Trigger in meinem Postgres db verweist. Normalerweise funktionieren die Funktionen, die ich schreibe gut, jedoch diese spezielle Funktion Fehler am Ende der Ausgabe um die Syntax zurückgibt.Erstelle meinen ersten Trigger in Postgresql mit Syntaxfehler in der Nähe von "LANGUAGE"

Ich habe eine Fixtures-Tabelle mit einer Spalte namens "Ergebnis". Ich möchte die Noten von der Vorrichtung lesen, z.B. Wölfe 0: 0 Ipswich und triggern in 'Draw'.

Die Abfrage I schreibe wie folgt:

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

ich nur die Grundfunktionen geschrieben haben vor, aber ich bin wirklich kämpfen mit immer dieser Trigger zu arbeiten.

+1

Ihnen fehlt ein ';' nach der Triggerfunktion (und vor dem 'create trigger'). Außerdem: 'SELECT NEW.Home_Side_Score, NEW.Away_Side_Score FROM Fixtures;' wählt *** alle *** Zeilen aus der Tabelle 'fixtures', jedoch mit konstanten Werten für jede Zeile. Sie brauchen diese Auswahl überhaupt nicht. In einer Reihe Ebene Trigger können Sie nur auf die 'neuen' und' alten' Datensätze zugreifen –

+0

Vielen Dank. Ich habe das fehlende Semikolon eingefügt, und das Problem wurde gelöst, ebenso wie das von Joachim identifizierte ELSIF-Problem. – LemusThelroy

+0

Ich habe gerade versucht, diesen Trigger zu verwenden, wenn ich Daten einfüge und es sagt mir "Error: record 'New' hat kein Feld 'home_side_score' CONTEXT: SQL-Anweisung" SELECT New.Home_Side_Score ist NULL oder New.Away_Sido_Score ist NULL "... ." Irgendwelche Ideen? Ich dachte, das New-Attribut würde die Daten enthalten, die ich importiere, so dass es ein Feld home_side_score usw. geben würde. – LemusThelroy

Antwort

1

Sie scheinen IF zu verwenden, wenn Sie ELSIF meinen. Diese Version kompiliert;

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

Ich habe gerade versucht, diesen Trigger zu verwenden, wenn ich Daten einfüge und es sagt mir "Fehler: Aufnahme 'Neu' hat kein Feld 'home_side_score' CONTEXT: SQL-Anweisung" SELECT New.Home_Side_Score ist NULL oder New.Away_Sido_Score ist NULL "... ." Irgendwelche Ideen? Ich dachte, das New-Attribut würde die Daten enthalten, die ich importiere, so dass es ein Feld home_side_score usw. geben würde. – LemusThelroy

Verwandte Themen