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.