Fehler beim Erstellen einer Prozedur

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:

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

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?

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

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.

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

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?

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.

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 :slight_smile:

Mit freundlichen Grüßen
InformaTiger