Det låter som att du försöker köra en PL/PgSQL
kodblock fristående, utan att slå in det i en funktion med
code>SKAPA ELLER ERSÄTT FUNKTION
. Det kommer inte att fungera, du måste inkludera det i en funktion eller (från PostgreSQL 9.0) en DO
blockera
. PL/PgSQL och vanlig SQL är olika språk så du kan inte bara köra PL/PgSQL-kod direkt.
Det skulle hjälpa om du förklarade varför du försöker skriva koden du klistrade in. Jag misstänker att du försöker lösa ett problem som är bättre att hantera med en triggerfunktion som en revisionstrigger .
Några viktiga anmärkningar:
Du måste uppdatera PostgreSQL :PostgreSQL 8.2 är farligt inaktuell och stöds inte . säkerhet och buggfixar släpps inte längre. Uppgradera brådskande till en version som stöds, men se till att läsa release notes a> för varje större ".0"-version som "8.3.0", "8.4.0" etc för migrerings- och kompatibilitetsråd.
Undvik 'nu'
:Dessutom, istället för att använda 'nu'
du bör vanligtvis använda aktuellt datum/tid funktioner
, särskilt current_timestamp
.
current_timestamp
är stabil :Hoophoppningen du gör är förmodligen onödig eftersom värdet på current_timestamp
(och 'now'::timestamp
) ändras inte under transaktionens varaktighet. T.ex.:
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
Detaljer
Din avsikt verkar vara något i stil med följande (felaktigt, använd inte ) kod:
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';
men du har missbrukat char
datatype, som kräver en längdparameter. Den är som standard 1 om den inte tillhandahålls så du får:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
ALDRIG använd char
datatyp i SQL; använd varchar
eller text
. För portabilitet över databaser varchar(n)
där n
är en maximal längd krävs; om portabilitet inte behövs använd text
.
Om du ändrar char
till text
i ovanstående kan din kod köras, men det är fortfarande inte meningsfullt. Jag misstänker starkt att du verkligen vill skriva:
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';
... men du visste inte om aktuella datum-/tidsfunktioner .
Även det är för mycket, egentligen. Jag tror att du försöker lösa ett problem som passar bättre för en trigger.