Fehler beim Erstellen einer Prozedur

Fragen und Probleme zu PL/pgSQL.
Antworten
informaTiger
Neuer Benutzer
Beiträge: 6
Registriert: So 29. Jan 2017, 12:45

Fehler beim Erstellen einer Prozedur

Beitrag von informaTiger » So 29. Jan 2017, 12:53

Hallo PG-Forum,

ich arbeite zwar nicht zum ersten mal mit PostgreSQL komme mir aber gerade so vor :p. Ich möchte einen einfachen Trigger schreiben, der mir nach dem INSERT auf die Tabelle File einen Eintrag in die Tabelle Notification schreibt. Dazu habe ich folgende Prozedur angelegt:

Code: Alles auswählen

DELIMITER $$

CREATE FUNCTION fn_file_created()
    RETURNS trigger AS
    $$
        BEGIN
            INSERT INTO tbl_notification(message, fk_user, date) VALUES
                ('hat die Datei ''' || NEW.name ''' hochgeladen.', NEW.fk_user, EXTRACT(epoch FROM NOW()));
        END;
    $$ LANGUAGE plpgsql;

DELIMITER ;
Ich erhalte aber ständig die drei Fehlermeldungen:
Error code 0, SQL state 42601: ERROR: syntax error at end of input
Position: 57
Line 118, column 1

Error code 0, SQL state 42601: ERROR: syntax error at or near "INSERT"
Position: 19
Line 121, column 9

Error code 0, SQL state 42601: ERROR: syntax error at or near "LANGUAGE"
Position: 1
Line 125, column 7
Die Line 118 ist hierbei die CREATE FUNCTION Anweißung. Hat jemand eine Idee was ich falsch mache?
Habe schon einige Tutorials durchgeschaut, erkenne aber keinen Unterschied zwischen deren und meiner Version.

Mit freundlichen Grüßen
InformaTiger

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Fehler beim Erstellen einer Prozedur

Beitrag von akretschmer » So 29. Jan 2017, 13:05

Nach NEW.name willst Du ja wohl einen String anlöten, da fehlt der || - Operator.

Deine ''' sind verwirrend, das EXTRACT(epoch from now()) ist auch Murks - warum speicherst Du nicht einfach den Timestamp?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

informaTiger
Neuer Benutzer
Beiträge: 6
Registriert: So 29. Jan 2017, 12:45

Re: Fehler beim Erstellen einer Prozedur

Beitrag von informaTiger » So 29. Jan 2017, 13:09

Danke für deine schnelle Hilfe.

Leider hat der || Operator noch nicht viel an meiner Situation geändert. Einen Timestamp möchte ich aus dem Grund nicht speichern, da ich generell einen numerischen Wert für Datums bevorzuge. Die einfachen Anführungszeichen stehen deshalb hier, da ich den Dateinamen gerne in Anführungszeichen hätte.

Mit freundlichen Grüßen
InformaTiger

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Fehler beim Erstellen einer Prozedur

Beitrag von akretschmer » So 29. Jan 2017, 13:30

Naja, jedenfalls fehlt da dennoch der || - Operator, so wird das jedenfalls nix. Ein Timestamp so zu speichern mag zwar gehen, wird Dir aber früher oder später auf die Füße fallen.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

informaTiger
Neuer Benutzer
Beiträge: 6
Registriert: So 29. Jan 2017, 12:45

Re: Fehler beim Erstellen einer Prozedur

Beitrag von informaTiger » So 29. Jan 2017, 13:35

Den hab ich schon ausgebessert. Mein Skript sieht jetzt so aus:

Code: Alles auswählen

DELIMITER $$

CREATE FUNCTION fn_file_created()
    RETURNS trigger AS
    $$
        BEGIN
            INSERT INTO tbl_notification(message, fk_user, date) VALUES
                ('hat die Datei ''' || NEW.name || ''' hochgeladen.', NEW.fk_user, EXTRACT(epoch FROM NOW()));
        END;
    $$ LANGUAGE plpgsql;

DELIMITER ;
Wie meinst du das mit dem Timestamp? Wo genau liegt das Problem wenn ich es als BIGINT bzw INT in der Datenbank speichere?

Edit: meinst du den 19 Januar 2038 - von wegen 32-Bit Overflow beim Timestamp?

akretschmer
Erfahrener Benutzer
Beiträge: 7677
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Fehler beim Erstellen einer Prozedur

Beitrag von akretschmer » So 29. Jan 2017, 14:12

Geht es denn nun?

Mit Datumswerten will man manchmal auch rechnen, oder diese im Where verwenden. Das erschwerst Du massiv, auch die Verwendung von Indexen erschwerst Du damit. PostgreSQL hat viele Stärken - eine ist die Verfügbarkeit passender Datentypen für so quasi alles. Sollte man nutzen.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

informaTiger
Neuer Benutzer
Beiträge: 6
Registriert: So 29. Jan 2017, 12:45

Re: Fehler beim Erstellen einer Prozedur

Beitrag von informaTiger » So 29. Jan 2017, 14:23

Achso, jetzt verstehe ich. Hmm, ist wohl eine Designfrage - werd ich mir auf jeden fall noch mal überlegen.

Ja, es geht jetzt: der Fehler war kein syntaktischer sondern NetBeans war schlicht und einfach dran schuld, dass die SQL-Anweißung fehlgeschlagen ist. Führe ich mein Skript im Terminal aus, läuft es perfekt ohne Fehler.

Danke für deine Hilfe :)

Mit freundlichen Grüßen
InformaTiger

Antworten