Oficjalnie PostgreSQL ma tylko „funkcje”. Funkcje wyzwalające są czasami nazywane „procedurami wyzwalającymi”, ale użycie to nie ma wyraźnego znaczenia. Wewnętrznie funkcje są czasami nazywane procedurami, na przykład w katalogu systemowym pg_proc
. To pozostałość po PostQUEL. Wszelkie funkcje, które niektóre osoby (prawdopodobnie z doświadczeniem w różnych systemach baz danych) mogą skojarzyć z procedurami, takie jak ich znaczenie w zapobieganiu wstrzyknięciom SQL lub wykorzystaniu parametrów wyjściowych, mają również zastosowanie do funkcji istniejących w PostgreSQL.
Teraz, gdy ludzie ze społeczności PostgreSQL mówią o „procedurach przechowywanych” lub „prawdziwych procedurach przechowywanych”, często mają one na myśli hipotetyczną funkcję obiektu podobnego do funkcji, który może uruchamiać i zatrzymywać transakcje w jego ciele, coś, czego obecne funkcje nie mogą robić. W tym kontekście wydaje się, że użycie terminu „procedura składowana” jest analogiczne do innych produktów bazodanowych. Zobacz ten wątek listy mailingowej, aby uzyskać niejasny pomysł.
W praktyce jednak to rozróżnienie funkcji i procedury pod względem ich możliwości kontrolowania transakcji nie jest powszechnie akceptowane, a na pewno wielu programistów bez stronniczości bazy danych przyjmie interpretację procedury podobną do Pascala jako funkcję bez wartości zwracanej. (Wydaje się, że standard SQL ma środkowy punkt, ponieważ procedura domyślnie ma inne zachowanie transakcyjne niż funkcja, ale można to dostosować do obiektu.) Tak więc w każdym przypadku, a zwłaszcza, gdy patrzy się na pytania na temat wymiany stosów za pomocą bardzo zróżnicowana publiczność, należy unikać zbytniego zakładania i używać jaśniejszych terminów lub definiować oczekiwane właściwości.
Porównując przyjętą odpowiedź z abstrakcyjnego poziomu pojęciowego, rozumiem różnicę od funkcjonalności i perspektywy wejścia / wyjścia. Poniżej użyłem sp i f do przedstawienia odpowiednio procedury składowanej i funkcji.
Użyj w wyrażeniu: sp nie może być użyte w wyrażeniu, podczas gdy funkcja może, co oznacza, że możesz użyć zwróconej wartości zf wewnątrz innych instrukcji, takich jak
zwraca wartość: sp nie zwraca automatycznie wartości, chyba że określisz typ zwracany przez rekursor , otwórz i zwróć kursor; f zwraca wynik w ostatniej instrukcji, w której osadzona jest klauzula „return”, podobnie jak klauzula select .
zwraca pojedyncze / wielokrotne zestawy wyników: tutaj zestawy wyników odnoszą się do listy wyników, które mogą różnić się formatem, takich jak zestaw pojedynczej liczby całkowitej, tablicy tekstowej i dwóch tabel. sp może zwracać wiele zestawów, pod warunkiem, że określisz typ zwracany przez Refursor, otwieraj i zwracaj kursor. Jednak f może zwrócić tylko jeden typ zestawu.
Zwykle procedury przechowywane są używane do modyfikowania danych lub struktury bazy danych, w których wartość zwracana nie jest potrzebna, takich jak usuwanie, aktualizacja, upuszczanie itp .; lub sytuacje, w których wymaganych jest wiele zestawów wyników. Z drugiej strony funkcja jest wybierana głównie dla zwykłych zapytań.
Aby uzyskać więcej informacji na temat mojego wyjaśnienia, zapoznaj się z tym linkiem: Procedury i funkcje przechowywane w PostgreSQL
źródło