PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Não é possível executar o bloco no PostgreSQL 8.2


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.