1

Temat: Wyjątek z funkcji

Witam
Mam taka funkcje która kasuje rekord, a jeżeli jest on powiązany z inną tabelą i jest błąd ( nie ma usuwania kaskadowego) to ma zwrócić wartość z kolumny nazwa_towaru tabeli z której usuwamy.

CREATE OR REPLACE FUNCTION fkasuj_do_usuniecimagazyn (
  "zm_nr_towaru_skladnik" integer
)
RETURNS VARCHAR AS
$body$
  begin
     delete from tab_magazyn where nr_towaru_skladnik = zm_nr_towaru_skladnik;
     return 0;
     EXCEPTION
        WHEN foreign_key_violation THEN
            RAISE NOTICE 'Powiazane rekordy';
            RETURN nazwa_towaru;
end;
$body$
LANGUAGE 'plpgsql'
SECURITY DEFINER

Funkcja się kompiluje ale przy wywołaniu select * from fkasuj_do_usuniecimagazyn(72) dostaje błąd że kolumna nazwa_towaru nie istnieje

NOTICE:  Powiazane rekordy
ERROR:  column "nazwa_towaru" does not exist
LINE 1: SELECT  nazwa_towaru

W jaki sposób to naprawić?

Z góry dzięki za pomoc
AdamP.

Ostatnio edytowany przez adamleon (2011-01-22 16:49:54)

2

Odp: Wyjątek z funkcji

Masz jakieś triggery / reguły na tej tabeli ?

Pozdrawiam
Pawel Socha

3

Odp: Wyjątek z funkcji

Nie, nie mam

Ostatnio edytowany przez adamleon (2011-01-23 01:16:05)

4

Odp: Wyjątek z funkcji

Najprościej (zeby bylo jak najmniej modyfikacji) chyba bedzie zrobić tak

CREATE OR REPLACE FUNCTION fkasuj_do_usuniecimagazyn (
  "zm_nr_towaru_skladnik" integer
)
RETURNS VARCHAR AS
$body$
  declare 
  towar tab_magazyn.nazwa_towaru%TYPE;
  begin
     delete from tab_magazyn where nr_towaru_skladnik = zm_nr_towaru_skladnik;
     return 0;
     EXCEPTION
        WHEN foreign_key_violation THEN
            select nazwa_towaru INTO towar FROM tab_magazyn where nr_towaru_skladnik = zm_nr_towaru_skladnik;
            RAISE NOTICE 'Powiazane rekordy';
            RETURN towar;
end;
$body$
LANGUAGE 'plpgsql'
SECURITY DEFINER

Ostatnio edytowany przez rski (2011-01-23 09:52:18)

5

Odp: Wyjątek z funkcji

Dzięki, działa

Ale jeszcze mam jedna sprawę, chodzi o debugowanie funkcji. Juz kiedys o to pytałem, ale nie rozwiazałem problemu. Znalazłem taki opis w sieci

"W celu włączenia debugowania procedur i funkcji w pgAdminie (Postgresql 8.3/8.4 z pakietu EnterpriseDB) należy w pliku
postgresql.conf zmienić parametr shared_preload_libraries na:

MS Windows:
shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll'

Mac OS X/Linux:
shared_preload_libraries = '$libdir/plugins/plugin_debugger.so'

następnie uruchomić skrypt /share/contrib/pldbgapi.sql w bazie, która ma mieć możliwość debugowania procedur/funkcji"

Jednak w Postgresql9 na windows po odznaczeniu shared_preload_libraries server się nie uruchamia.

Czy to chodzi o wersję EnterpriseDB i dlatego nie działa?
Czy ktoś może się interesował tym tematem.

6

Odp: Wyjątek z funkcji

7

Odp: Wyjątek z funkcji

Witam
Instalowałem wersję standartowo bez żadnych dodatkowych opcji. Ściągnąłem SQL Manager for PostgreSQL w pełnej wersji 30-dniowa i tam jest debugowanie funkcji pomimo zahaszowanej opcji shared_preload_libraries w konfiguracji serwera. Jak na razie to wystarcza.