PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Impossibile eseguire il blocco in PostgreSQL 8.2

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.