PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

État SQL :erreur de syntaxe 42601 à ou près de 11

Essayez ce formulaire largement simplifié :

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;

Points majeurs :

  • Vous pouvez affecter des variables dans plpgsql au moment de la déclaration. Simplifie le code.

  • Utilisez to_char() pour formater votre date. Beaucoup plus simple.

  • now() et CURRENT_TIMESTAMP faites de même.

  • Ne citez pas 'now()' , utilisez now() (sans guillemets) si vous voulez l'horodatage actuel.

  • Utilisez le USING clause avec EXECUTE , vous n'avez donc pas à convertir le timestamp en text et retour - peut-être se heurter à citation des problèmes comme vous l'avez fait. Plus rapide, plus simple, plus sûr.

  • En LANGUAGE plpgsql , plpgsql est un mot-clé et ne doit pas être cité.

  • Vous voudrez peut-être vérifier si la table existe déjà avec CREATE TABLE IF NOT EXISTS , disponible depuis PostgreSQL 9.1.