it-swarm.dev

Jakie są różnice między „procedurami przechowywanymi” a „funkcjami przechowywanymi”?

Tak więc komentarz to pytanie wspomina, że ​​istnieje niewielka różnica w „Zapisanych procedurach” i „Zapisanych funkcjach” w PostgreSQL.

Komentarz prowadzi do artykuł na Wikipedii , ale niektóre z nich wydają się nie mieć zastosowania (np. Że można ich użyć w instrukcji SELECT).

Sam składnia wydaje się nieco mylący:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Tworzysz FUNCTION, ale nazywaj to PROCEDURE.

Jaka jest różnica między tymi dwoma?

37
DrColossos

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ą zrobić. W tym kontekście wydaje się, że termin „procedura składowana” jest analogiczny do innych produktów bazodanowych. Zobacz ta lista mailingowa wątek dla niejasnego pomysłu.

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 pośredni charakter, ponieważ procedura według domyślnie ma inne zachowanie transakcyjne niż funkcja, ale można to skorygować według obiekt.) Tak więc w każdym przypadku, a zwłaszcza patrząc na pytania na Stack Exchange z bardzo zróżnicowaną publicznością, powinieneś unikać przyjmowania zbyt wielu założeń i używania jaśniejszych terminów lub definiowania oczekiwanych właściwości.

44
Peter Eisentraut

Pod względem DDL Postgres nie ma obiektów procedur, tylko funkcje. Funkcje Postgres mogą zwracać wartości lub unieważniać, więc przyjmują role zarówno funkcji, jak i procedur w innych RDBMS. Słowo „procedura” w create trigger odnosi się do funkcji.

Pod względem dokumentacji Postgres'a „procedura” jest również synonimem obiektu bazy danych zwanego funkcją, np .: „ Procedura wyzwalająca jest tworzona za pomocą polecenia CREATE FUNCTION ”.

„Procedury” wyzwalacza mają określone reguły: muszą być zadeklarowane jako funkcja bez argumentów i typu zwracanego wyzwalacza . Przykład tutaj .

Terminy „procedura składowana” i „funkcja składowana” są używane zamiennie w PostgreSQL i ogólnie uważa się, że oznaczają to samo. Inne bazy danych mogą różnicować procedurę i funkcję (podobnie jak How VB rozróżnia podprogramy i funkcje).

Tak długo, jak funkcja w PostgreSQL zwraca coś, co przypomina tabelę, możesz użyć wyniku tej funkcji tak, jakby to była tabela standardowa. CREATE TRIGGER Składnia jest nieco myląca, ale podejrzewam, że mogła istnieć przed sfinalizowaniem standardu ANSI. Mam tylko kopię SQL: 2003, więc nie mogę zrobić nic więcej niż spekulować, dlaczego nomenklatura jest dziwna.

Wersja TL; DR: z PostgreSQL „procedura” jest równoważna „funkcji”.

8
Jeremiah Peschka

W MSSQL procedura składowana jest wstępnie skompilowanym zestawem poleceń SQL.
Procedura składowana:

 - może mieć wiele parametrów wejściowych i wyjściowych 
 - może być używany do modyfikowania tabel/struktur/danych bazy danych 
 - nie jest zwykle używany w instrukcjach wstawiania/aktualizacji/usuwania/wyboru 
 - może mieć wiele parametrów wejściowych, ale zwraca tylko jedną wartość (tj. konkatenację łańcucha) 
 - może zaakceptować zestaw jako dane wejściowe, zwraca pojedynczą wartość (np. dbo.FindLargestPig (ListOfPigs)) 
 - zwraca tabelę (tj. wybierz * z dbo.ExplodeString („to jest lista słów”)) 
 - może być użyty w instrukcjach select/insert/update/delete 
 - NIE MOŻNA użyć do modyfikacji tabel/struktur/danych bazy danych 
6
datagod

Krótka odpowiedź brzmi: funkcja zwraca wartość, ale procedura nie.

To rozróżnienie było obecne w modułach przechowywanych trwałych (SQL/PSM), które zostały zaproponowane dla SQL 1992. Nie wiem, czy SQL/PSM kiedykolwiek spełnił standardy.

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.

  1. 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

    select * 
    from table 
    where col_a < (select col_A from f())
    
  2. zwraca wartość: sp nie zwraca automatycznie wartości, chyba że określisz refcursor typ zwrotu, otwórz i zwróć kursor; f zwraca wynik w ostatniej instrukcji, w której osadzona jest klauzula „return”, np. klauzula select .

  3. 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, otwórz i zwróć 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 przechowywane i funkcje w PostgreSQL

2
Frank

Należy zauważyć, że w PostgreSQL 11 procedury składowane zostały dodane jako nowy obiekt schematu. Możesz utworzyć nową procedurę, używając CREATE PROCEDURE instrukcja.

Procedury przechowywane różnią się od funkcji w następujący sposób:

  • Procedury składowane nie mają wartości zwracanej
  • Transakcje można zatwierdzać i wycofywać w ramach procedur przechowywanych, ale nie w funkcjach
  • Procedurę składowaną wykonujesz za pomocą instrukcji CALL zamiast instrukcji SELECT.
1
d4nyll