PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

SQL състояние:42601 синтактична грешка при или близо до 11

Опитайте този до голяма степен опростен формуляр:

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;

Основни точки:

  • Можете да присвоите променливи в plpgsql по време на декларацията. Опростява кода.

  • Използвайте to_char() за форматиране на вашата дата. Много по-просто.

  • now() и CURRENT_TIMESTAMP направете същото.

  • Не цитирайте 'now()' , използвайте now() (без кавички), ако искате текущото времево клеймо.

  • Използвайте USING клауза с EXECUTE , така че не е необходимо да конвертирате timestamp към текст и обратно - евентуално попадане вната проблеми като вас. По-бързо, по-лесно, по-безопасно.

  • В LANGUAGE plpgsql , plpgsql е ключова дума и не трябва да се цитира.

  • Може да искате да проверите дали таблицата вече съществува с CREATE ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА , наличен от PostgreSQL 9.1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Присъединете се към множество маси, като използвате distinct on

  2. Как да посоча „началото днес“ в определена часова зона?

  3. ubuntu `env:'pg_dump':Няма такъв файл или директория` грешка

  4. Сценарии за паралелност с INSERT

  5. Предайте динамично име на схема и име на таблица във FROM в заявка за избор в Postgres