Pruebe esta forma en gran parte simplificada:
CREATE OR REPLACE FUNCTION somefunc()
RETURNS void AS
$func$
DECLARE
addresstablename text := 'address_history_' || to_char(now(), 'FMDD_MM_YYYY');
BEGIN
EXECUTE
'CREATE TABLE ' || addresstablename || '() INHERITS (address_all)';
EXECUTE
'INSERT INTO ' || addresstablename || '
SELECT *
FROM address_history
WHERE address_timestamp >= $1'
USING date_trunc('hour', now() - interval '7 days');
END
$func$ LANGUAGE plpgsql;
Puntos principales:
-
Puede asignar variables en plpgsql en el momento de la declaración. Simplifica el código.
-
Use
to_char()
para formatear su fecha. Mucho más sencillo. -
now()
yCURRENT_TIMESTAMP
haz lo mismo. -
No cite
'now()'
, usanow()
(sin comillas) si desea la marca de tiempo actual. -
Use el
USING
cláusula conEXECUTE
, por lo que no tiene que convertir latimestamp
atext
y viceversa, posiblemente encontrándose con citas problemas como lo hiciste tú. Más rápido, más simple, más seguro. -
En
LANGUAGE plpgsql
,plpgsql
es una palabra clave y no debe citarse. -
Es posible que desee verificar si la tabla ya existe con
CREATE TABLE IF NOT EXISTS
, disponible desde PostgreSQL 9.1.