Prova denna till stor del förenklade 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;
Huvudpunkter:
-
Du kan tilldela variabler i plpgsql vid deklarationstillfället. Förenklar koden.
-
Använd
to_char()
för att formatera ditt datum. Mycket enklare. -
now()
ochCURRENT_TIMESTAMP
gör detsamma. -
Citera inte
'now()'
, användnow()
(utan citattecken) om du vill ha den aktuella tidsstämpeln. -
Använd
USING sats med
, så att du inte behöver konverteraEXECUTE
tidsstämpeln
tilltext
och tillbaka - kanske stöter på citat problem som du gjorde. Snabbare, enklare, säkrare. -
På
LANGUAGE plpgsql
,plpgsql
är ett nyckelord och bör inte citeras. -
Du kanske vill kontrollera om tabellen redan finns med
CREATE TABELL OM INTE FINNS
, tillgängligt sedan PostgreSQL 9.1.