Versuchen Sie es mit dieser stark vereinfachten 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;
Hauptpunkte:
-
Sie können Variablen in plpgsql zum Zeitpunkt der Deklaration zuweisen. Vereinfacht den Code.
-
Verwenden Sie
to_char()
um Ihr Datum zu formatieren. Viel einfacher. -
now()
undCURRENT_TIMESTAMP
tun Sie dasselbe. -
'now()'
nicht zitieren , verwenden Sienow()
(ohne Anführungszeichen), wenn Sie den aktuellen Zeitstempel möchten. -
Verwenden Sie den
USING
-Klausel mitEXECUTE
, sodass Sie dentimestamp
nicht konvertieren müssen zutext
und zurück - möglicherweise in Zitate geraten Probleme wie Sie. Schneller, einfacher, sicherer. -
In
LANGUAGE plpgsql
,plpgsql
ist ein Schlüsselwort und sollte nicht in Anführungszeichen gesetzt werden. -
Sie können mit
CREATE TABLE IF NOT EXISTS
, verfügbar seit PostgreSQL 9.1.