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_TIMESTAMPgø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 konvertereEXECUTEtidsstemplettiltekstog tilbage - løber muligvis ind i citering problemer som du gjorde. Hurtigere, enklere, sikrere. -
På
LANGUAGE plpgsql,plpgsqler 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.