Es hört sich so an, als ob Sie versuchen, ein PL/PgSQL
auszuführen Codeblock eigenständig, ohne ihn mit 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.