Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PQSQL] PL/PGSQL - obsługa błędów
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
juzwa
Przykład - jest sobie insert do tabeli, która ma parę checków, jakaś kolumna ma indeks unique

i teraz chcę sobie zrobić w funkcji PL/PGSQL obsługę błędów

jak widziałem we wzorze jest tak, że
EXEPTION
WHEN nazwa_błedu THEN


itp itd

a nie ma czegoś co by załatwiało wszystko od ręki, bo rodzajów błędów może być sporo i żeby nie szukać w opisach błedów i nie domyslać się jakie to się mogą rzeczy przydarzyć to żeby zrobić na wszystkie błędy
Sedziwoj
Wiesz w PHP,Java możesz wyłapać wszystkie wyjątki korzystając z tego, że wszystkie dziedziczą, jak dobrze czytam to PostgreSQL ma wyjątki po prostu niezależne, nie obiektowe, więc nie ma raczej możliwości aby łapać całą pule.
Do tego wyłapywanie wszystkich "tak na wszelki wypadek" jest najgłupszym podejściem, bo po to wyłapujesz, aby coś z tym zrobić, bo jak będziesz wszystkie błędy ukrywał, to do końca świata nie dojdziesz dlaczego coś nie działa.
juzwa
dzięki za zainteresowanie i odpowiedź

jakoś sobie z tymi moimi pytaniami metoda prób i błędów poradziłem

sprawa wygląda tak - robię coś dla znajomego i tak ze względów praktyczno dydaktycznych wziąłem sobie postgresa - bo prawie nic w nim nie robiłem wcześniej

no i mam problem następny

chcę zrobić TRIGGERA - na AFTER INSERT
- chcę aby do innej tabeli zapisał się rekord w którym jest LAST ID tego właśnie zapisego rekordu

zrobiłem to tak

  1. BEGIN INSERT INTO profile (usr_id,prf_time)
  2. VALUES (NEW.id_usr,now());
  3. RETURN NEW;
  4. END;


i mam błąd

record "new" is not assigned yet


jak takie cos zrobić?
Sedziwoj
Nie wiem czy po prostu nie masz coś źle zrobione w reszcie kodu, bo tu wygląda na poprawny.
Na pewno masz na założony na tej tabeli co idzie insert i czy jest poprawna definicja triggera?
juzwa
jakoś sobie poradziłem z problemem

ale skoro masz jeszcze ochotę na dyskusje smile.gif to wracając to tematu obsługi błędów

czy jest w PL/PQSQL coś takiego jak TRY CATCH?


taka instrukcja wyłapuje wszystkie błędy i o takie coś mi chodzi - wiem, że może się przydarzyć błąd typu1, typu2
no to na to mam CATCH(typ1) CATCH(typ2) i jeśli by coś było jeszcze nie tak to na końcu CATCH(ogólny)


i takie coś by się przydało np do transakcji
Sedziwoj
http://www.postgresql.org/docs/current/sta...-ERROR-TRAPPING

Przeczytaj na samym dole, chyba o to Ci chodziło.

Co do wyłapywania większej puli błędów, to jak już pisałem to nie jest obiektowe, nie ma dziedziczenia, więc nie można tego zrobić jak w programowaniu obiektowym. Jedyne co mi przychodzi do głowy to specjalna nazwa która wyłapuje wszystkie, ale to było by bez sensu, bo błędy wyłapujesz te, które wiesz że możesz je poprawić inne lecą dalej.
juzwa
dzięki raz jeszcze, własnie tak sobie radzę

co prawda znalazłem na liście błędów


successful_completion

ale nie wiem jak sprawdzić czy było OK

bo np takie coś

EXCEPTION
WHEN NOT successful_completion THEN

czy

EXCEPTION
WHEN !successful_completion THEN

generuje błąd

a to by usprawniło sprawę bo jak jest successful_completion to jest OK można np dać COMMIT a jak nie ma successful_completio można dac ROLLBACK i po wszystkim
Sedziwoj
Przecież jak wystąpi błąd podczas transakcji jest robiony automatycznie rollback.

I na pewno negacja w PostgeSQL to 'NOT' a nie wykrzyknik.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.