Ściśle mówiąc, Postgres nie miał procedury przechowywane zgodnie z definicją w normie ISO/IEC przed wersją 11. Termin ten jest często używany nieprawidłowo w odniesieniu do funkcji , które zapewniają wiele takich samych funkcji (i więcej), jak inne RDBMS z „procedurami składowanymi”. Główną różnicą jest obsługa transakcji.
- Jakie są różnice między „procedurami składowanymi” a „funkcjami składowanymi”?
Prawdziwe procedury przechowywane zostały wreszcie wprowadzone w Postgres 11:
- Kiedy używać procedury składowanej / funkcji zdefiniowanej przez użytkownika?
Funkcje są atomowe w Postgres i automatycznie uruchamiane w ramach własnej transakcji, chyba że zostanie wywołane w ramach transakcji zewnętrznej. Zawsze działają w ramach jednej transakcji i kończą się sukcesem lub niepowodzeniem całkowicie . W konsekwencji nie można rozpoczynać ani dokonywać transakcji w ramach funkcji. I polecenia, takie jak VACUUM
, CREATE DATABASE
lub CREATE INDEX CONCURRENTLY
które nie działają w kontekście transakcji, nie są dozwolone.
Instrukcja dotycząca PL/pgSQL:
Funkcje i procedury wyzwalające są zawsze wykonywane w ramach transakcji ustanowionej przez zapytanie zewnętrzne — nie mogą rozpocząć ani zatwierdzić tej transakcji, ponieważ nie byłoby kontekstu, w którym mogłyby zostać wykonane. Jednak blok zawierający EXCEPTION
klauzula skutecznie tworzy podtransakcję, którą można wycofać bez wpływu na transakcję zewnętrzną.
Obsługa błędów:
Domyślnie każdy błąd występujący w funkcji PL/pgSQL przerywa wykonywanie funkcji, a także otaczającej ją transakcji. Możesz przechwytywać błędy i je usuwać za pomocą BEGIN
blok z EXCEPTION
klauzula.
Istnieją wyjątki , w tym między innymi:
- dane zapisywane w plikach dziennika
-
zmiany wprowadzone w sekwencji
Ważne :Niektóre typy danych i funkcje PostgreSQL mają specjalne zasady dotyczące zachowań transakcyjnych. W szczególności zmiany dokonane w kolejności (a tym samym liczniku kolumny zadeklarowanej przy użyciu
serial
) są natychmiast widoczne dla wszystkich innych transakcji i nie są cofane, jeśli transakcja, która wprowadziła zmiany, zostanie przerwana. -
przygotowane oświadczenia
- Demo SQL Fiddle
-
połączenia dblink (lub podobne)
- Czy Postgres obsługuje transakcje zagnieżdżone lub autonomiczne?