Prøv denne stort set forenklede 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;
Vigtige punkter:
-
Du kan tildele variabler i plpgsql på deklarationstidspunktet. Forenkler kode.
-
Brug
to_char()
for at formatere din dato. Meget enklere. -
nu()
ogCURRENT_TIMESTAMP
gør det samme. -
Citér ikke
'now()'
, brugnow()
(uden anførselstegn), hvis du ønsker det aktuelle tidsstempel. -
Brug
USING klausul med
, så du ikke behøver at konvertereEXECUTE
tidsstemplet
tiltekst
og tilbage - løber muligvis ind i citering problemer som du gjorde. Hurtigere, enklere, sikrere. -
På
LANGUAGE plpgsql
,plpgsql
er et nøgleord og bør ikke citeres. -
Du vil måske tjekke, om tabellen allerede eksisterer med
CREATE TABEL HVIS IKKE FINDER
, tilgængelig siden PostgreSQL 9.1.