Patrzę na procedury i funkcje składowane MySQL. Jaka jest prawdziwa różnica?
Wydają się być podobne, ale funkcja ma więcej ograniczeń.
Prawdopodobnie się mylę, ale wygląda na to, że procedura składowana może zrobić wszystko, a więcej funkcja składowana. Dlaczego / kiedy miałbym używać procedury, a nie funkcji?
mysql
stored-procedures
sql-function
Anonim
źródło
źródło
Najbardziej ogólna różnica między procedurami i funkcjami polega na tym, że są one wywoływane w różny sposób i do różnych celów:
Składnia tworzenia rutynowych procedur różni się nieco w przypadku procedur i funkcji:
Funkcje zwracają wartość, więc w definicji funkcji musi znajdować się klauzula RETURNS wskazująca typ danych wartości zwracanej. Ponadto w treści funkcji musi znajdować się co najmniej jedna instrukcja RETURN, aby zwrócić wartość do obiektu wywołującego. RETURNS i RETURN nie pojawiają się w definicjach procedur.
Aby wywołać procedurę składowaną, użyj
CALL statement
. Aby wywołać zapisaną funkcję, odwołaj się do niej w wyrażeniu. Funkcja zwraca wartość podczas obliczania wyrażenia.Procedura jest wywoływana za pomocą instrukcji CALL i może przekazywać wartości tylko przy użyciu zmiennych wyjściowych. Funkcję można wywołać z wnętrza instrukcji, tak jak każdą inną funkcję (to znaczy wywołując nazwę funkcji) i może zwrócić wartość skalarną.
Określenie parametru jako IN, OUT lub INOUT jest ważne tylko dla PROCEDURY. W przypadku FUNKCJI parametry są zawsze traktowane jako parametry IN.
Jeśli przed nazwą parametru nie podano słowa kluczowego, domyślnie jest to parametr IN. Parametry zapisanych funkcji nie są poprzedzone przez IN, OUT ani INOUT. Wszystkie parametry funkcji są traktowane jako parametry IN.
Aby zdefiniować procedurę składowaną lub funkcję, użyj odpowiednio opcji CREATE PROCEDURE lub CREATE FUNCTION:
Rozszerzenie MySQL dla procedury składowanej (nie funkcji) polega na tym, że procedura może generować zestaw wyników lub nawet wiele zestawów wyników, które obiekt wywołujący przetwarza w taki sam sposób, jak wynik instrukcji SELECT. Jednak zawartości takich zestawów wyników nie można używać bezpośrednio w wyrażeniu.
Procedury składowane (odnoszące się zarówno do procedur składowanych, jak i funkcji składowanych) są powiązane z określoną bazą danych, podobnie jak tabele lub widoki. Usunięcie bazy danych powoduje również usunięcie wszystkich procedur przechowywanych w bazie danych.
Procedury i funkcje składowane nie współużytkują tej samej przestrzeni nazw. W bazie danych można mieć procedurę i funkcję o tej samej nazwie.
W procedurach składowanych można używać dynamicznego języka SQL, ale nie w funkcjach lub wyzwalaczach.
Kilka bardziej interesujących różnic między PROCEDURĄ FUNKCJONALNĄ a ZAPISANĄ:
( Ten punkt jest kopiowany z postu na blogu ) . Procedura składowana jest prekompilowanym planem wykonania, gdzie funkcje nie są. Funkcja przeanalizowana i skompilowana w czasie wykonywania. Procedury składowane, przechowywane jako pseudokod w bazie danych, czyli w formie skompilowanej.
( Nie jestem pewien do tego punktu. )
Procedura składowana ma zabezpieczenia i zmniejsza ruch w sieci, a także możemy wywołać procedurę składowaną w dowolnym nie. aplikacji naraz. odniesienie
Funkcje są zwykle używane do obliczeń, w których procedury są zwykle używane do wykonywania logiki biznesowej.
Funkcje nie mogą wpływać na stan bazy danych (instrukcje, które wykonują jawne lub niejawne zatwierdzanie lub wycofywanie zmian, są w funkcji niedozwolone) Zważywszy, że procedury składowane mogą wpływać na stan bazy danych za pomocą zatwierdzania itp.
Odniesienie: J.1. Ograniczenia dotyczące procedur przechowywanych i wyzwalaczy
Funkcje nie mogą używać instrukcji FLUSH , podczas gdy procedury składowane mogą to robić.
Funkcje składowane nie mogą być cykliczne, podczas gdy procedury składowane mogą. Uwaga: Rekurencyjne procedury składowane są domyślnie wyłączone, ale można je włączyć na serwerze, ustawiając zmienną systemową serwera max_sp_recursion_depth na wartość różną od zera. Aby uzyskać więcej informacji, zobacz Sekcja 5.2.3, „Zmienne systemowe” .
W ramach funkcji przechowywanej lub wyzwalacza nie można modyfikować tabeli, która jest już używana (do odczytu lub zapisu) przez instrukcję, która wywołała funkcję lub wyzwalacz. Dobry przykład: Jak zaktualizować tę samą tabelę podczas usuwania w MYSQL?
Uwaga : chociaż niektóre ograniczenia zwykle dotyczą funkcji składowanych i wyzwalaczy, ale nie procedur składowanych, ograniczenia te dotyczą procedur składowanych, jeśli są wywoływane z funkcji składowanej lub wyzwalacza. Na przykład, chociaż można użyć FLUSH w procedurze składowanej, takiej procedury składowanej nie można wywołać z funkcji składowanej lub wyzwalacza.
źródło
Jedną istotną różnicą jest to, że możesz uwzględnić funkcję w zapytaniach SQL, ale procedury składowane mogą być wywoływane tylko za pomocą
CALL
instrukcji:Przykład UDF:
Przykład Sproc:
źródło
RETURNS CHAR(50) DETERMINISTIC
?RETURNS CHAR(50)
zostaną zwrócone stany jaki typ danych. ToRETURN CONCAT(...
są dane, które są zwracane. Potrzebne są oba. NależyDETERMINISTIC
stwierdzić, że dane bazowe nie zostaną zmodyfikowane.W zapytaniu można używać funkcji przechowywanej. Możesz następnie zastosować go do każdego wiersza lub w ramach klauzuli WHERE.
Procedura jest wykonywana przy użyciu zapytania CALL.
źródło
Procedurę składowaną można wywołać rekurencyjnie, ale funkcji składowanej nie
źródło