Zdá se, že se pokoušíte spustit PL/PgSQL
samostatný blok kódu, bez jeho zabalení do funkce pomocí CREATE OR REPLACE FUNCTION
. To nebude fungovat, musíte to zahrnout do funkce nebo (od PostgreSQL 9.0) do DO
zablokovat
. PL/PgSQL a plain SQL jsou různé jazyky takže nemůžete přímo spouštět kód PL/PgSQL.
Pomohlo by, kdybys vysvětlil proč pokoušíte se napsat kód, který jste vložili. Mám podezření, že se snažíte vyřešit problém, který je lepší vyřešit pomocí funkce spouštěcí funkce jako spouštěč auditu .
Některé důležité poznámky:
Musíte aktualizovat PostgreSQL :PostgreSQL 8.2 je nebezpečně zastaralý a nepodporován . zabezpečení a opravy chyb již nejsou vydávány. Urychleně upgradujte na podporovanou verzi, ale nezapomeňte si přečíst poznámky k vydání pro každou hlavní verzi ".0", jako je "8.3.0", "8.4.0" atd. pro rady ohledně migrace a kompatibility.
Vyhněte se 'now'
:Také místo použití 'now'
obvykle byste měli používat aktuální datum/čas funkce
, zejména current_timestamp
.
current_timestamp
je stabilní :Přeskakování, které děláte, je pravděpodobně zbytečné, protože hodnota current_timestamp
(a 'now'::timestamp
) se po dobu trvání transakce nemění. Např.:
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
Podrobnosti
Zdá se, že váš záměr je něco jako následující (nesprávné, nepoužívejte ) kód:
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';
ale zneužili jste char
datový typ, který vyžaduje parametr délky. Výchozí hodnota je 1, pokud není dodaná, takže dostanete:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
NIKDY použijte char
datový typ v SQL; použijte varchar
nebo text
. Pro přenositelnost mezi databázemi varchar(n)
kde n
je požadována maximální délka; pokud přenositelnost není nutná, použijte text
.
Pokud změníte char
na text
ve výše uvedeném se váš kód může spustit, ale stále to nedává žádný smysl. Silně mám podezření, že opravdu chcete napsat:
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';
... ale nevěděli jste o funkce aktuálního data/času .
I to je moc, opravdu. Myslím, že se snažíte vyřešit problém, který je vhodnější pro spouštěč.