PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Stato SQL:errore di sintassi 42601 pari o vicino a 11

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() e CURRENT_TIMESTAMP fai lo stesso.

  • Non citare 'now()' , usa now() (senza virgolette) se vuoi il timestamp corrente.

  • Usa USING clausola con EXECUTE , quindi non devi convertire il timestamp a text 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.