sql >> Database >  >> RDS >> PostgreSQL

SQL-status:42601 syntaxisfout op of nabij 11

Probeer deze grotendeels vereenvoudigde vorm:

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;

Belangrijkste punten:

  • U kunt variabelen toewijzen in plpgsql op het moment van declaratie. Vereenvoudigt code.

  • Gebruik to_char() om uw datum te formatteren. Veel eenvoudiger.

  • now() en CURRENT_TIMESTAMP doe hetzelfde.

  • Citeer 'now()' niet , gebruik now() (zonder aanhalingstekens) als u de huidige tijdstempel wilt.

  • Gebruik de USING clausule met EXECUTE , zodat u de timestamp . niet hoeft te converteren naar text en terug - mogelijk tegenkomen citaten problemen zoals jij deed. Sneller, eenvoudiger, veiliger.

  • In LANGUAGE plpgsql , plpgsql is een trefwoord en mag niet worden aangehaald.

  • U kunt controleren of de tabel al bestaat met CREATE TABLE IF NOT EXISTS , beschikbaar sinds PostgreSQL 9.1.



  1. Gegevens ophalen uit drie tabellen in SQL

  2. SQL SELECT WHERE rij bevat woord

  3. ondersteunt rails postgres adapter ssl?

  4. Zoekopdrachtresultaat per veld uit een andere tabel bestellen (MySQL)