PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Estado SQL:erro de sintaxe 42601 em ou próximo de 11


Experimente este formulário amplamente simplificado:
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;

Pontos principais:


  • Você pode atribuir variáveis ​​em plpgsql no momento da declaração. Simplifica o código.

  • Use to_char() para formatar sua data. Muito mais simples.

  • agora() e CURRENT_TIMESTAMP faça o mesmo.

  • Não cite 'now()' , use agora() (sem aspas) se você quiser o timestamp atual.

  • Use o USING cláusula com EXECUTE , para que você não precise converter o timestamp para texto e vice-versa - possivelmente esbarrando em citações questões como você fez. Mais rápido, mais simples, mais seguro.

  • Em LANGUAGE plpgsql , plpgsql é uma palavra-chave e não deve ser citada.

  • Você pode querer verificar se a tabela já existe com CREATE TABELA SE NÃO EXISTE , disponível desde o PostgreSQL 9.1.