PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Block kann in PostgreSQL 8.2 nicht ausgeführt werden

Es hört sich so an, als ob Sie versuchen, ein PL/PgSQL auszuführen Codeblock eigenständig, ohne ihn mit FUNKTION ERSTELLEN ODER ERSETZEN . Das funktioniert nicht, Sie müssen es in eine Funktion oder (ab PostgreSQL 9.0) einen TUN blockieren . PL/PgSQL und einfaches SQL sind unterschiedliche Sprachen Sie können also nicht einfach PL/PgSQL-Code direkt ausführen.

Es wäre hilfreich, wenn Sie warum erklären würden Sie versuchen, den eingefügten Code zu schreiben. Ich vermute, Sie versuchen, ein Problem zu lösen, das besser mit einer Trigger-Funktion behandelt werden kann wie ein Audit-Trigger .

Einige wichtige Hinweise:

Sie müssen PostgreSQL aktualisieren :PostgreSQL 8.2 ist gefährlich veraltet und wird nicht unterstützt . Sicherheits- und Fehlerbehebungen werden nicht mehr veröffentlicht. Aktualisieren Sie dringend auf eine unterstützte Version, aber lesen Sie unbedingt die Versionshinweise für jede größere ".0"-Version wie "8.3.0", "8.4.0" usw. für Migrations- und Kompatibilitätsratschläge.

Vermeiden Sie 'jetzt' :Auch statt 'now' zu verwenden Sie sollten normalerweise das aktuelle Datum/Uhrzeit verwenden Funktionen , insbesondere aktueller_Zeitstempel .

aktueller_Zeitstempel ist stabil :Das Reifenspringen, das Sie machen, ist wahrscheinlich unnötig, weil der Wert von current_timestamp (und 'now'::timestamp ) ändert sich für die Dauer einer Transaktion nicht. Beispiel:

regress=# BEGIN;
regress=# SELECT current_timestamp;
 2012-08-14 14:52:43.382596+08
regress=# SELECT pg_sleep(5);
regress=# SELECT current_timestamp;
 2012-08-14 14:52:43.382596+08

Einzelheiten

Ihre Absicht scheint in etwa so zu sein (falsch, nicht verwenden ) Code:

CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
DECLARE
        curtime char;
BEGIN
        curtime := 'now';
        INSERT INTO logtable VALUES (logtxt, curtime);
        RETURN curtime;
END;
$$ LANGUAGE 'plpgsql';

aber Sie haben das char missbraucht Datentyp, der einen Längenparameter erfordert. Es ist standardmäßig 1, wenn es nicht angegeben wird, also erhalten Sie:

regress=# SELECT some_function();
ERROR:  value too long for type character(1)
CONTEXT:  PL/pgSQL function "some_function" line 5 at assignment

NIEMALS Verwenden Sie das char Datentyp in SQL; Verwenden Sie varchar oder text . Für datenbankübergreifende Portabilität varchar(n) wobei n ist eine maximale Länge erforderlich; wenn Portabilität nicht benötigt wird, verwenden Sie text .

Wenn Sie char ändern zu Text Im obigen Beispiel könnte Ihr Code ausgeführt werden, aber es macht immer noch keinen Sinn. Ich vermute stark, dass Sie wirklich schreiben wollen:

CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
BEGIN
        INSERT INTO logtable VALUES (logtxt, current_timestamp);
        RETURN current_timestamp;
END;
$$ LANGUAGE 'plpgsql';

... aber Sie wussten nichts über den Aktuelle Datums-/Uhrzeitfunktionen .

Selbst das ist wirklich zu viel. Ich glaube, Sie versuchen, ein Problem zu lösen, das besser für einen Trigger geeignet ist.