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

SQL-tilstand:42601 syntaksfejl ved eller tæt på 11

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() og CURRENT_TIMESTAMP gør det samme.

  • Citér ikke 'now()' , brug now() (uden anførselstegn), hvis du ønsker det aktuelle tidsstempel.

  • Brug USING klausul med EXECUTE , så du ikke behøver at konvertere tidsstemplet til tekst og tilbage - løber muligvis ind i citering problemer som du gjorde. Hurtigere, enklere, sikrere.

  • 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.



  1. OPDATERINGER til statistik

  2. Sådan gemmer man signatur i MySQL

  3. Hvordan er det indre af en udarbejdet erklæring?

  4. MySQL-forespørgsel for at finde den mest lignende numeriske række