sql >> Databáze >  >> RDS >> PostgreSQL

Stav SQL:Chyba syntaxe 42601 na nebo blízko 11

Zkuste tento značně zjednodušený formulář:

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;

Hlavní body:

  • Proměnné můžete přiřadit v plpgsql v době deklarace. Zjednodušuje kód.

  • Použijte to_char() pro formátování data. Mnohem jednodušší.

  • nyní() a CURRENT_TIMESTAMP udělejte totéž.

  • Neuvádějte 'now()' , použijte now() (bez uvozovek), pokud chcete aktuální časové razítko.

  • Použijte POUŽITÍ klauzule s EXECUTE , takže nemusíte převádět časové razítko na text a zpět – možná narazíte na citování problémy jako ty. Rychlejší, jednodušší, bezpečnější.

  • V LANGUAGE plpgsql , plpgsql je klíčové slovo a nemělo by být uváděno v uvozovkách.

  • Možná budete chtít zkontrolovat, zda tabulka již existuje pomocí CREATE TABLE IF NOT EXISTS , dostupný od PostgreSQL 9.1.



  1. Postgres dotaz je velmi pomalý s aktuální_datum::datum místo pevně zakódovaného data

  2. Chyba replikace MySQL 2003

  3. Je globálně rozdělený index lepší (rychlejší) než nerozdělený index?

  4. Odesílat geolokaci uživatele na server každou minutu