Het klinkt alsof je een PL/PgSQL
probeert uit te voeren codeblok stand-alone, zonder het in een functie te stoppen met behulp van CREATE OR REPLACE FUNCTION
. Dat werkt niet, je moet het opnemen in een functie of (van PostgreSQL 9.0) een DO
blokkeren
. PL/PgSQL en gewone SQL zijn verschillende talen dus je kunt PL/PgSQL-code niet zomaar rechtstreeks uitvoeren.
Het zou helpen als je uitlegt waarom je probeert de code te schrijven die je hebt geplakt. Ik vermoed dat je een probleem probeert op te lossen dat beter kan worden opgelost met een triggerfunctie zoals een audit-trigger .
Enkele belangrijke opmerkingen:
Je moet PostgreSQL updaten :PostgreSQL 8.2 is gevaarlijk verouderd en niet ondersteund . beveiligings- en bugfixes worden niet langer vrijgegeven. Upgrade dringend naar een ondersteunde versie, maar lees zeker de release-opmerkingen voor elke belangrijke ".0"-versie zoals "8.3.0", "8.4.0", enz. voor advies over migratie en compatibiliteit.
Vermijd 'now'
:Ook, in plaats van 'now'
u moet gewoonlijk de huidige datum/tijd gebruiken functies
, in het bijzonder current_timestamp
.
current_timestamp
is stabiel :Het hoepelspringen dat u doet is waarschijnlijk niet nodig omdat de waarde van current_timestamp
(en 'now'::timestamp
) verandert niet voor de duur van een transactie. Bijv.:
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
Details
Uw bedoeling lijkt ongeveer het volgende te zijn (onjuist, niet gebruiken ) 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';
maar je hebt de char
. misbruikt datatype, waarvoor een lengteparameter vereist is. Het staat standaard op 1 als het niet wordt geleverd, dus je krijgt:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
NOOIT gebruik de char
gegevenstype in SQL; gebruik varchar
of text
. Voor cross-database portabiliteit varchar(n)
waar n
is een maximale lengte vereist; als draagbaarheid niet nodig is, gebruik dan text
.
Als u char
. wijzigt naar text
in het bovenstaande kan uw code worden uitgevoerd, maar het heeft nog steeds geen zin. Ik vermoed sterk dat je echt wilt schrijven:
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';
... maar je wist niets van de huidige datum/tijd functies .
Zelfs dat is eigenlijk te veel. Ik denk dat je een probleem probeert op te lossen dat beter past bij een trigger.