Det lyder som om du prøver at køre en PL/PgSQL
kodeblok stand-alone uden at pakke den ind i en funktion ved hjælp af >CREATE OR REPLACE FUNCTION
. Det virker ikke, du skal inkludere det i en funktion eller (fra PostgreSQL 9.0) en DO
blokere
. PL/PgSQL og almindelig SQL er forskellige sprog så du kan ikke bare køre PL/PgSQL-kode direkte.
Det ville hjælpe, hvis du forklarede hvorfor du prøver at skrive den kode, du indsatte. Jeg formoder, at du forsøger at løse et problem, der er bedre håndteret med en triggerfunktion som en revisionstrigger .
Nogle vigtige bemærkninger:
Du skal opdatere PostgreSQL :PostgreSQL 8.2 er farligt forældet og understøttet ikke . sikkerhed og fejlrettelser frigives ikke længere. Opgrader hurtigst muligt til en understøttet version, men sørg for at læse udgivelsesbemærkningerne a> for hver større ".0"-version som "8.3.0", "8.4.0" osv. for migrerings- og kompatibilitetsrådgivning.
Undgå 'now'
:Også i stedet for at bruge 'now'
du skal normalt bruge den aktuelle dato/klokkeslæt funktioner
, især current_timestamp
.
current_timestamp
er stabil :Det hoop-jumping, du laver, er sandsynligvis unødvendigt, fordi værdien af current_timestamp
(og 'now'::timestamp
) ændres ikke i varigheden af en transaktion. F.eks.:
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 hensigt ser ud til at være noget i stil med følgende (forkert, brug ikke ) kode:
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 misbrugt char
datatype, som kræver en længdeparameter. Den er som standard 1, hvis den ikke leveres, 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 brug char
datatype i SQL; brug varchar
eller text
. Til krydsdatabaseportabilitet varchar(n)
hvor n
er en maksimal længde påkrævet; hvis portabilitet ikke er nødvendig, brug text
.
Hvis du ændrer char
til text
i ovenstående kan din kode køre, men det giver stadig ingen mening. Jeg formoder stærkt, at du virkelig vil skrive:
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 kendte ikke til aktuelle dato-/tidsfunktioner .
Selv det er virkelig for meget. Jeg tror, du prøver at løse et problem, der passer bedre til en trigger.