Опитайте този до голяма степен опростен формуляр:
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;
Основни точки:
-
Можете да присвоите променливи в plpgsql по време на декларацията. Опростява кода.
-
Използвайте
to_char()код>за форматиране на вашата дата. Много по-просто. -
now()иCURRENT_TIMESTAMPнаправете същото. -
Не цитирайте
'now()', използвайтеnow()(без кавички), ако искате текущото времево клеймо. -
Използвайте
USINGкод> клауза с, така че не е необходимо да конвертиратеEXECUTEtimestampкъмтексти обратно - евентуално попадане вната проблеми като вас. По-бързо, по-лесно, по-безопасно. -
В
LANGUAGE plpgsql,plpgsqlе ключова дума и не трябва да се цитира. -
Може да искате да проверите дали таблицата вече съществува с
CREATE ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА, наличен от PostgreSQL 9.1.