Sembra che tu stia tentando di eseguire un PL/PgSQL
blocco di codice autonomo, senza racchiuderlo in una funzione utilizzando CREATE OR REPLACE FUNCTION
. Non funzionerà, devi includerlo in una funzione o (da PostgreSQL 9.0) un DO
bloccare
. PL/PgSQL e SQL semplice sono linguaggi diversi quindi non puoi semplicemente eseguire direttamente il codice PL/PgSQL.
Sarebbe utile se spiegassi perché stai provando a scrivere il codice che hai incollato. Sospetto che tu stia cercando di risolvere un problema che è meglio gestire con una funzione trigger come un attivatore di controllo .
Alcune note importanti:
Devi aggiornare PostgreSQL :PostgreSQL 8.2 è pericolosamente obsoleto e non supportato . la sicurezza e le correzioni di bug non vengono più rilasciate. Aggiorna urgentemente a una versione supportata, ma assicurati di leggere le note sulla versione per ogni versione principale ".0" come "8.3.0", "8.4.0", ecc. per consigli su migrazione e compatibilità.
Evita 'now'
:Inoltre, invece di usare 'now'
di solito dovresti usare la data/ora corrente funzioni
, in particolare current_timestamp
.
current_timestamp
è stabile :Il salto a cerchio che stai facendo probabilmente non è necessario perché il valore di current_timestamp
(e 'now'::timestamp
) non cambia per la durata di una transazione. Es.:
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
Dettagli
La tua intenzione sembra essere simile alla seguente (errata, non utilizzare ) codice:
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';
ma hai usato in modo improprio il char
tipo di dati, che richiede un parametro di lunghezza. Il valore predefinito è 1 se non viene fornito, quindi otterrai:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
MAI usa il char
tipo di dati in SQL; usa varchar
o text
. Per la portabilità tra database varchar(n)
dove n
è richiesta una lunghezza massima; se la portabilità non è necessaria usa text
.
Se modifichi char
a text
in quanto sopra, il tuo codice potrebbe essere eseguito, ma non ha ancora alcun senso. Sospetto fortemente che tu voglia davvero scrivere:
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';
... ma non sapevi del funzioni di data/ora correnti .
Anche questo è troppo, davvero. Penso che tu stia cercando di risolvere un problema che si adatta meglio a un trigger.