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_TIMESTAMPfaç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 oEXECUTEtimestampparatextoe 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.