Wypróbuj tę w dużym stopniu uproszczoną formę:
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;
Główne punkty:
-
Możesz przypisać zmienne w plpgsql w czasie deklaracji. Upraszcza kod.
-
Użyj
to_char()
aby sformatować swoją datę. Dużo prostsze. -
now()
iCURRENT_TIMESTAMP
zrób to samo. -
Nie cytuj
'now()'
, użyjnow()
(bez cudzysłowów), jeśli chcesz aktualny znacznik czasu. -
Użyj
USING klauzula z
, więc nie musisz konwertowaćEXECUTE
sygnatury czasowej
dotekstu
iz powrotem - prawdopodobnie wpadnie w cytowanie problemy takie jak ty. Szybciej, prościej, bezpieczniej. -
W języku
JĘZYK plpgsql
,plpgsql
jest słowem kluczowym i nie powinno być cytowane. -
Możesz sprawdzić, czy tabela już istnieje z
CREATE TABELA JEŚLI NIE ISTNIEJE
, dostępny od wersji PostgreSQL 9.1.