sql >> Databasteknik >  >> RDS >> PostgreSQL

SQL-tillstånd:42601 syntaxfel vid eller nära 11

Prova denna till stor del förenklade 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;

Huvudpunkter:

  • Du kan tilldela variabler i plpgsql vid deklarationstillfället. Förenklar koden.

  • Använd to_char() för att formatera ditt datum. Mycket enklare.

  • now() och CURRENT_TIMESTAMP gör detsamma.

  • Citera inte 'now()' , använd now() (utan citattecken) om du vill ha den aktuella tidsstämpeln.

  • Använd USING sats med EXECUTE , så att du inte behöver konvertera tidsstämpeln till text och tillbaka - kanske stöter på citat problem som du gjorde. Snabbare, enklare, säkrare.

  • LANGUAGE plpgsql , plpgsql är ett nyckelord och bör inte citeras.

  • Du kanske vill kontrollera om tabellen redan finns med CREATE TABELL OM INTE FINNS , tillgängligt sedan PostgreSQL 9.1.



  1. Kartlägg ett PostGIS-geometripunktfält med Hibernate on Spring Boot

  2. MySQL främmande nyckel vid radering

  3. Laravel kapslade relationer

  4. Tom fil efter nedladdning