Prova questo modulo in gran parte semplificato:
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;
Punti principali:
-
Puoi assegnare variabili in plpgsql al momento della dichiarazione. Semplifica il codice.
-
Usa
to_char()
per formattare la tua data. Molto più semplice. -
now()
eCURRENT_TIMESTAMP
fai lo stesso. -
Non citare
'now()'
, usanow()
(senza virgolette) se vuoi il timestamp corrente. -
Usa
USING
clausola conEXECUTE
, quindi non devi convertire iltimestamp
atext
e ritorno - possibilmente incappare in citando problemi come hai fatto tu. Più veloce, più semplice, più sicuro. -
In
LANGUAGE plpgsql
,plpgsql
è una parola chiave e non deve essere tra virgolette. -
Potresti voler controllare se la tabella esiste già con
CREATE TABLE IF NOT EXISTS
, disponibile da PostgreSQL 9.1.