Wygląda na to, że próbujesz uruchomić PL/PgSQL
samodzielny blok kodu, bez pakowania go w funkcję przy użyciu CREATE OR REPLACE FUNCTION
. To nie zadziała, musisz uwzględnić to w funkcji lub (z PostgreSQL 9.0) DO
zablokuj
. PL/PgSQL i zwykły SQL to różne języki więc nie możesz po prostu uruchomić kodu PL/PgSQL bezpośrednio.
Dobrze by było, gdybyś wyjaśnił, dlaczego próbujesz napisać kod, który wkleiłeś. Podejrzewam, że próbujesz rozwiązać problem, który można lepiej rozwiązać za pomocą funkcji wyzwalacza jak wyzwalacz audytu .
Kilka ważnych uwag:
Musisz zaktualizować PostgreSQL :PostgreSQL 8.2 jest niebezpiecznie przestarzały i nieobsługiwany . zabezpieczenia i poprawki błędów nie są już wydawane. Pilnie uaktualnij do obsługiwanej wersji, ale koniecznie przeczytaj informacje o wydaniu dla każdej głównej wersji „.0”, takiej jak „8.3.0”, „8.4.0” itp., aby uzyskać porady dotyczące migracji i zgodności.
Unikaj 'now'
:Ponadto, zamiast używać 'now'
zwykle powinieneś używać bieżącej daty/godziny funkcje
, w szczególności current_timestamp
.
current_timestamp
jest stabilny :Przeskakiwanie, które wykonujesz, jest prawdopodobnie niepotrzebne, ponieważ wartość current_timestamp
(i 'now'::timestamp
) nie zmienia się na czas trwania transakcji. Np.:
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
Szczegóły
Wygląda na to, że Twoja intencja jest podobna do następującej (nieprawidłowa, nie używaj ) kod:
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';
ale niewłaściwie użyłeś char
datatype, który wymaga parametru długości. Domyślnie jest to 1, jeśli nie jest dostarczone, więc otrzymasz:
regress=# SELECT some_function();
ERROR: value too long for type character(1)
CONTEXT: PL/pgSQL function "some_function" line 5 at assignment
NIGDY użyj char
typ danych w SQL; użyj varchar
lub text
. Przenośność między bazami danych varchar(n)
gdzie n
czy wymagana jest maksymalna długość; jeśli przenośność nie jest potrzebna, użyj text
.
Jeśli zmienisz char
do text
powyżej, twój kod może działać, ale nadal nie ma to sensu. Podejrzewam, że naprawdę chcesz napisać:
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';
... ale nie wiedziałeś o bieżące funkcje daty/czasu .
Nawet to za dużo, naprawdę. Myślę, że próbujesz rozwiązać problem, który lepiej pasuje do wyzwalacza.