PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Nie można uruchomić bloku w PostgreSQL 8.2

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd Heroku:ActionView::Template::Error (niezdefiniowana metoda `captcha' dla #<Message:0x007fc9df016930>)

  2. Python Postgres psycopg2 ThreadedConnectionPool wyczerpany

  3. UTWÓRZ BAZĘ DANYCH wewnątrz transakcji

  4. Unikalne indeksy PostgreSQL i wielkość liter

  5. Jak Atan2d() działa w PostgreSQL