Experimente este formulário amplamente simplificado:
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;
Pontos principais:
-
Você pode atribuir variáveis em plpgsql no momento da declaração. Simplifica o código.
-
Useto_char()
para formatar sua data. Muito mais simples.
-
agora()
eCURRENT_TIMESTAMP
faça o mesmo.
-
Não cite'now()'
, useagora()
(sem aspas) se você quiser o timestamp atual.
-
Use oUSING cláusula com
, para que você não precise converter oEXECUTE
timestamp
paratexto
e vice-versa - possivelmente esbarrando em citações questões como você fez. Mais rápido, mais simples, mais seguro.
-
EmLANGUAGE plpgsql
,plpgsql
é uma palavra-chave e não deve ser citada.
-
Você pode querer verificar se a tabela já existe comCREATE TABELA SE NÃO EXISTE
, disponível desde o PostgreSQL 9.1.