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.