Звучи сякаш се опитвате да стартирате 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';
... но не знаехте за текущи функции за дата/час .
Дори това е прекалено, наистина. Мисля, че се опитвате да разрешите проблем, който е по-подходящ за задействане.