Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Procedura składowana MySQL a funkcja, której powinienem użyć, kiedy?

Najbardziej ogólna różnica między procedurami i funkcjami polega na tym, że są wywoływane w różny sposób i do różnych celów:

  1. Procedura nie zwraca wartości. Zamiast tego jest wywoływana z instrukcją CALL w celu wykonania operacji takiej jak modyfikacja tabeli lub przetwarzanie pobranych rekordów.
  2. Funkcja jest wywoływana w wyrażeniu i zwraca pojedynczą wartość bezpośrednio do wywołującego, która ma być użyta w wyrażeniu.
  3. Nie możesz wywołać funkcji za pomocą instrukcji CALL, ani nie możesz wywołać procedury w wyrażeniu.

Składnia rutynowego tworzenia różni się nieco w przypadku procedur i funkcji:

  1. Parametry procedury można zdefiniować jako tylko wejście, tylko wyjście lub oba. Oznacza to, że procedura może przekazać wartości z powrotem do wywołującego przy użyciu parametrów wyjściowych. Dostęp do tych wartości można uzyskać w instrukcjach następujących po instrukcji CALL. Funkcje mają tylko parametry wejściowe. W rezultacie, chociaż zarówno procedury, jak i funkcje mogą mieć parametry, deklaracja parametrów procedury różni się od deklaracji funkcji.
  2. Funkcje zwracają wartość, dlatego w definicji funkcji musi znajdować się klauzula RETURNS wskazująca typ danych zwracanej wartości. Ponadto w treści funkcji musi znajdować się co najmniej jedna instrukcja RETURN, aby zwrócić wartość do 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ć przechowywaną funkcję, odnieś się do niej w wyrażeniu. Funkcja zwraca wartość podczas oceny wyrażenia.

    • Procedura jest wywoływana za pomocą instrukcji CALL i może przekazywać wartości z powrotem tylko za pomocą zmiennych wyjściowych. Funkcję można wywołać z wnętrza instrukcji, tak jak każdą inną funkcję (to znaczy przez wywołanie nazwy 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 funkcji przechowywanych 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 CREATE PROCEDURE lub CREATE FUNCTION:

CREATE PROCEDURE proc_name ([parameters])
 [characteristics]
 routine_body


CREATE FUNCTION func_name ([parameters])
 RETURNS data_type       // diffrent
 [characteristics]
 routine_body

Rozszerzenie MySQL dla procedury składowanej (nie funkcji) polega na tym, że procedura może generować zestaw wyników, a nawet wiele zestawów wyników, które obiekt wywołujący przetwarza w taki sam sposób, jak wynik instrukcji SELECT. Jednak zawartość takich zestawów wyników nie może być używana bezpośrednio w wyrażeniu.

Przechowywane procedury (odnosi się zarówno do procedur składowanych, jak i funkcji składowanych) są skojarzone z konkretną bazą danych, podobnie jak tabele lub widoki. Kiedy usuniesz bazę danych, wszelkie procedury przechowywane w bazie danych również zostaną usunięte.

Procedury i funkcje składowane nie mają 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 SQL, ale nie w funkcjach ani wyzwalaczach.

Przygotowane instrukcje SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE) mogą być używane w procedurach składowanych, ale nie w funkcjach składowanych ani wyzwalaczach. W związku z tym funkcje składowane i wyzwalacze nie mogą używać dynamicznego SQL (w którym konstruujesz instrukcje jako ciągi, a następnie je wykonujesz). (Dynamiczny SQL w procedurach przechowywanych w MySQL )

Niektóre bardziej interesujące różnice między FUNKCJĄ a PROCEDURĄ PRZECHOWYWANIA:

  1. (Ten punkt to skopiowano z wpisu na blogu . )Procedura składowana to wstępnie skompilowany plan wykonania, w którym funkcje nie są. Funkcja przeanalizowana i skompilowana w czasie wykonywania. Procedury składowane, przechowywane jako pseudokod w bazie danych, tj. skompilowany formularz.

  2. (Nie jestem tego pewien. )
    Procedura składowana ma bezpieczeństwo i zmniejsza ruch w sieci, a także możemy wywołać procedurę składowaną w dowolnym nr. aplikacji na raz. odniesienie

  3. Funkcje są zwykle używane do obliczeń, w których procedury są zwykle używane do wykonywania logiki biznesowej.

  4. Funkcje nie mogą wpływać na stan bazy danych (stwierdzenia, które wykonują jawne lub niejawne zatwierdzanie lub wycofywanie są niedozwolone w funkcji) podczas gdy procedury przechowywane mogą wpływać na stan bazy danych za pomocą zatwierdzania itp.
    odniesienie:J.1. Ograniczenia dotyczące zapisanych rutyn i wyzwalaczy

  5. Funkcje nie mogą używać FLUSH oświadczenia, podczas gdy procedury przechowywane mogą to zrobić.

  6. Funkcje składowane nie mogą być rekurencyjne, podczas gdy procedury składowane mogą być.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ść niezerową. Zobacz Sekcja 5.2.3 , „Zmienne systemowe” , aby uzyskać więcej informacji.

  7. Wewnątrz przechowywanej funkcji 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ę po usunięciu w MYSQL?

Uwaga :że chociaż niektóre ograniczenia zwykle dotyczą funkcji składowanych i wyzwalaczy, ale nie procedur składowanych, te ograniczenia mają zastosowanie do procedur składowanych, jeśli są wywoływane z funkcji składowanej lub wyzwalacza. Na przykład, chociaż możesz użyć FLUSH w procedurze składowanej, takiej procedury składowanej nie można wywołać z funkcji składowanej lub wyzwalacza.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić błąd MySQL w PHP dla długiego zapytania, które zależy od danych wejściowych użytkownika?

  2. Słowo kluczowe LIMIT na MySQL z przygotowaną instrukcją

  3. Przechowywanie i wyświetlanie ciągu Unicode (हिन्दी) przy użyciu PHP i MySQL

  4. Zapobiegaj automatycznemu przyrostowi w przypadku duplikatu wstawiania MySQL

  5. Migracja bazy danych Oracle do MySQL na AWS, część 2