sql >> Base de Datos >  >> RDS >> PostgreSQL

Estado de SQL:error de sintaxis 42601 en o cerca de 11

Pruebe esta forma en gran parte simplificada:

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;

Puntos principales:

  • Puede asignar variables en plpgsql en el momento de la declaración. Simplifica el código.

  • Use to_char() para formatear su fecha. Mucho más sencillo.

  • now() y CURRENT_TIMESTAMP haz lo mismo.

  • No cite 'now()' , usa now() (sin comillas) si desea la marca de tiempo actual.

  • Use el USING cláusula con EXECUTE , por lo que no tiene que convertir la timestamp a text y viceversa, posiblemente encontrándose con citas problemas como lo hiciste tú. Más rápido, más simple, más seguro.

  • En LANGUAGE plpgsql , plpgsql es una palabra clave y no debe citarse.

  • Es posible que desee verificar si la tabla ya existe con CREATE TABLE IF NOT EXISTS , disponible desde PostgreSQL 9.1.