Parece que você está tentando executar um PL/PgSQL bloco de código autônomo, sem envolvê-lo em uma função usando
CREATE OR REPLACE FUNCTION
. Isso não funcionará, você precisa incluí-lo em uma função ou (do PostgreSQL 9.0) um DO
bloquear
. PL/PgSQL e SQL simples são linguagens diferentes então você não pode simplesmente executar o código PL/PgSQL diretamente. Ajudaria se você explicasse por que você está tentando escrever o código que você colou. Suspeito que você esteja tentando resolver um problema que é melhor tratado com uma função de gatilho como um gatilho de auditoria .
Algumas observações importantes:
Você precisa atualizar o PostgreSQL :O PostgreSQL 8.2 está perigosamente desatualizado e sem suporte . segurança e correções de bugs não estão mais sendo lançadas. Atualize urgentemente para uma versão compatível, mas certifique-se de ler as notas de lançamento para cada versão ".0" principal, como "8.3.0", "8.4.0", etc. para orientação sobre migração e compatibilidade.
Evite
'now'
:Além disso, em vez de usar 'now'
você normalmente deve usar a data/hora atual funções
, especialmente current_timestamp
. current_timestamp
é estável :O salto de aro que você está fazendo provavelmente é desnecessário porque o valor de current_timestamp
(e 'now'::timestamp
) não muda durante a transação. Por exemplo: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
Detalhes
Sua intenção parece ser algo como o seguinte (incorreto, não use ) código:
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';
mas você fez mau uso do
char
tipo de dados, que requer um parâmetro de comprimento. O padrão é 1 se não for fornecido, então você obterá:regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
NUNCA use o
char
tipo de dados em SQL; use varchar
ou text
. Para portabilidade entre bancos de dados varchar(n)
onde n
é necessário um comprimento máximo; se a portabilidade não for necessária, use text
. Se você alterar
char
para text
acima, seu código pode ser executado, mas ainda não faz sentido. Eu suspeito fortemente que você realmente quer escrever: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';
... mas você não sabia sobre o funções de data/hora atuais .
Até isso é demais, na verdade. Acho que você está tentando resolver um problema que é mais adequado para um gatilho.