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

Не може да стартира блок в PostgreSQL 8.2

Звучи сякаш се опитвате да стартирате PL/PgSQL кодов блок самостоятелен, без да го обгръща във функция с помощта на CREATE OR REPLACE FUNCTION . Това няма да работи, трябва да го включите във функция или (от PostgreSQL 9.0) DO блокиране . PL/PgSQL и обикновеният SQL са различни езици така че не можете просто да стартирате PL/PgSQL код директно.

Ще помогне, ако обясните защо опитвате се да напишете кода, който сте поставили. Подозирам, че се опитвате да разрешите проблем, който е по-добре да се управлява с тригерна функция като тригер за проверка .

Някои важни бележки:

Трябва да актуализирате PostgreSQL :PostgreSQL 8.2 е опасно остарял и не се поддържа . сигурността и корекциите на грешки вече не се пускат. Надстройте спешно до поддържана версия, но не забравяйте да прочетете бележките по изданието за всяка основна версия ".0", като "8.3.0", "8.4.0" и т.н. за съвети за миграция и съвместимост.

Избягвайте 'now' :Освен това, вместо да използвате 'now' обикновено трябва да използвате текущата дата/час функции , особено current_timestamp .

current_timestamp е стабилната :Прескачането на обръч, което правите, вероятно е ненужно, защото стойността на current_timestamp'now'::timestamp ) не се променя по време на транзакцията. Напр.:

regress=# BEGIN;
regress=# SELECT current_timestamp;
 2012-08-14 14:52:43.382596+08
regress=# SELECT pg_sleep(5);
regress=# SELECT current_timestamp;
 2012-08-14 14:52:43.382596+08

Подробности

Вашето намерение изглежда е нещо като следното (неправилно, не използвайте ) код:

CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
DECLARE
        curtime char;
BEGIN
        curtime := 'now';
        INSERT INTO logtable VALUES (logtxt, curtime);
        RETURN curtime;
END;
$$ LANGUAGE 'plpgsql';

но сте използвали неправилно char тип данни, който изисква параметър за дължина. По подразбиране е 1, ако не е предоставено, така че ще получите:

regress=# SELECT some_function();
ERROR:  value too long for type character(1)
CONTEXT:  PL/pgSQL function "some_function" line 5 at assignment

НИКОГА използвайте char тип данни в SQL; използвайте varchar или text . За преносимост между бази данни varchar(n) където n е необходима максимална дължина; ако преносимостта не е необходима, използвайте text .

Ако промените char към text в горното кодът ви може да се изпълнява, но все още няма смисъл. Силно подозирам, че наистина искате да напишете:

CREATE OR REPLACE FUNCTION some_function(logtxt text) RETURNS timestamptz AS $$
BEGIN
        INSERT INTO logtable VALUES (logtxt, current_timestamp);
        RETURN current_timestamp;
END;
$$ LANGUAGE 'plpgsql';

... но не знаехте за текущи функции за дата/час .

Дори това е прекалено, наистина. Мисля, че се опитвате да разрешите проблем, който е по-подходящ за задействане.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как и защо да добавя първични ключове към моята таблица на SQL база данни, когато вече имам индекс

  2. PL/pgSQL и SQL в PostgreSQL на същото ниво ли са като SQL/PSM стандарт, вместо само като SQL стандарт?

  3. Ще даде ли UUID като първичен ключ в PostgreSQL лоша производителност на индекса?

  4. Няма налично буферно пространство (достигната е максимална връзка?) Формуляр Postgres EDB драйвер

  5. Как Extract() работи в PostgreSQL