sql >> Base de Datos >  >> RDS >> PostgreSQL

No se puede ejecutar el bloque en PostgreSQL 8.2

Parece que estás intentando ejecutar un PL/PgSQL bloque de código independiente, sin envolverlo en una función usando CREATE OR REPLACE FUNCTION . Eso no funcionará, debe incluirlo en una función o (desde PostgreSQL 9.0) un DO bloquear . PL/PgSQL y SQL simple son lenguajes diferentes por lo que no puede simplemente ejecutar el código PL/PgSQL directamente.

Ayudaría si explicas por qué Estás tratando de escribir el código que pegaste. Sospecho que está tratando de resolver un problema que se maneja mejor con una función de activación como un disparador de auditoría .

Algunas notas importantes:

Necesitas actualizar PostgreSQL :PostgreSQL 8.2 está peligrosamente desactualizado y no compatible . ya no se publican correcciones de seguridad y errores. Actualice urgentemente a una versión compatible, pero asegúrese de leer las notas de la versión para cada versión principal ".0" como "8.3.0", "8.4.0", etc. para obtener consejos sobre migración y compatibilidad.

Evitar 'now' :Además, en lugar de usar 'now' por lo general, debe usar fecha/hora actual funciones , particularmente current_timestamp .

current_timestamp es estable :El salto de aro que está haciendo probablemente sea innecesario porque el valor de current_timestamp (y 'now'::timestamp ) no cambia durante la duración de una transacción. Por ejemplo:

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

Detalles

Su intención parece ser algo como lo siguiente (incorrecto, no 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';

pero has usado mal el char tipo de datos, que requiere un parámetro de longitud. El valor predeterminado es 1 si no se proporciona, por lo que obtendrá:

regress=# SELECT some_function();
ERROR:  value too long for type character(1)
CONTEXT:  PL/pgSQL function "some_function" line 5 at assignment

NUNCA usa el char tipo de datos en SQL; usa varchar o text . Para portabilidad entre bases de datos varchar(n) donde n se requiere una longitud máxima; si no se necesita portabilidad, use text .

Si cambia char a text en lo anterior, su código podría ejecutarse, pero aún así no tiene ningún sentido. Sospecho fuertemente que realmente quieres escribir:

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';

... pero no sabías sobre el funciones de fecha/hora actual .

Incluso eso es demasiado, de verdad. Creo que estás tratando de resolver un problema que encaja mejor con un disparador.