Essayez ce formulaire largement simplifié :
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;
Points majeurs :
-
Vous pouvez affecter des variables dans plpgsql au moment de la déclaration. Simplifie le code.
-
Utilisez
to_char()
pour formater votre date. Beaucoup plus simple. -
now()
etCURRENT_TIMESTAMP
faites de même. -
Ne citez pas
'now()'
, utiliseznow()
(sans guillemets) si vous voulez l'horodatage actuel. -
Utilisez le
USING
clause avecEXECUTE
, vous n'avez donc pas à convertir letimestamp
entext
et retour - peut-être se heurter à citation des problèmes comme vous l'avez fait. Plus rapide, plus simple, plus sûr. -
En
LANGUAGE plpgsql
,plpgsql
est un mot-clé et ne doit pas être cité. -
Vous voudrez peut-être vérifier si la table existe déjà avec
CREATE TABLE IF NOT EXISTS
, disponible depuis PostgreSQL 9.1.