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