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.