Probeer deze grotendeels vereenvoudigde vorm:
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;
Belangrijkste punten:
-
U kunt variabelen toewijzen in plpgsql op het moment van declaratie. Vereenvoudigt code.
-
Gebruik
to_char()
om uw datum te formatteren. Veel eenvoudiger. -
now()
enCURRENT_TIMESTAMP
doe hetzelfde. -
Citeer
'now()'
niet , gebruiknow()
(zonder aanhalingstekens) als u de huidige tijdstempel wilt. -
Gebruik de
USING
clausule metEXECUTE
, zodat u detimestamp
. niet hoeft te converteren naartext
en terug - mogelijk tegenkomen citaten problemen zoals jij deed. Sneller, eenvoudiger, veiliger. -
In
LANGUAGE plpgsql
,plpgsql
is een trefwoord en mag niet worden aangehaald. -
U kunt controleren of de tabel al bestaat met
CREATE TABLE IF NOT EXISTS
, beschikbaar sinds PostgreSQL 9.1.