Найбільш загальна відмінність між процедурами та функціями полягає в тому, що вони викликаються по-різному та з різною метою:
- Процедура не повертає значення. Замість цього на нього викликається оператор CALL для виконання такої операції, як зміна таблиці або обробка отриманих записів.
- Функція викликається в виразі і повертає одне значення безпосередньо абоненту, який буде використаний у виразі.
- Ви не можете викликати функцію з оператором CALL, а також не можете викликати процедуру в виразі.
Синтаксис для створення рутини дещо відрізняється щодо процедур та функцій:
- Параметри процедури можна визначити як лише вхідні дані, лише вихідні дані, або обидва. Це означає, що процедура може передавати значення назад абоненту, використовуючи вихідні параметри. До цих значень можна отримати доступ у операторах, які слідують за твердженням CALL. Функції мають лише вхідні параметри. Як результат, хоча і процедури, і функції можуть мати параметри, оголошення параметрів процедури відрізняється від функцій для функцій.
Функції повертають значення, тому у визначенні функції повинен бути пункт RETURNS, який вказує тип даних повернутого значення. Крім того, повинен бути принаймні один оператор RETURN у функціональному тілі, щоб повернути значення абоненту. RETURNS та RETURN у визначеннях процедури не відображаються.
Щоб викликати збережену процедуру, використовуйте CALL statement
. Щоб викликати збережену функцію, зверніться до неї у виразі. Функція повертає значення під час оцінки виразів.
Процедура викликається за допомогою оператора CALL і може передавати лише зворотні значення, використовуючи вихідні змінні. Функцію можна викликати всередині оператора, як і будь-яку іншу функцію (тобто, викликаючи ім'я функції), і може повернути скалярне значення.
Визначення параметра IN, OUT або INOUT справедливе лише для ПРОЦЕДУРИ. Для ФУНКЦІЇ параметри завжди розглядаються як параметри IN.
Якщо перед назвою параметра не вказано ключове слово, воно за замовчуванням є параметром IN.
Параметри для збережених функцій не передують IN, OUT або INOUT. Всі параметри функції розглядаються як параметри IN.
Щоб визначити збережену процедуру або функцію, використовуйте CREATE PROCEDURE або CREATE FUNCTION відповідно:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
Розширення MySQL для збереженої процедури (а не функції) полягає в тому, що процедура може генерувати набір результатів або навіть декілька наборів результатів, які абонент обробляє так само, як результат оператора SELECT. Однак вміст таких наборів результатів не може використовуватися безпосередньо в виразі.
Збережені підпрограми (що стосуються як збережених процедур, так і збережених функцій) пов'язані з певною базою даних, як і таблиці або представлення даних. Коли ви скидаєте базу даних, також зберігаються будь-які збережені підпрограми в базі даних.
Збережені процедури та функції не мають однакового простору імен. У базі даних можливо мати процедуру та функцію з тим самим іменем.
У збережених процедурах може використовуватися динамічний SQL, але не у функціях чи тригерах.
Підготовлені SQL заяви (PREPARE, EXECUTE, DEALLOCATE PREPARE) можуть використовуватися в збережених процедурах, але не зберігаються функціях або тригерах. Таким чином, збережені функції та тригери не можуть використовувати Dynamic SQL (де ви конструюєте оператори як рядки та виконуєте їх виконання). (Динамічний SQL у збережених процедурах MySQL)
Ще кілька цікавих відмінностей між функцією ФУНКЦІЇ та ЗБЕРІГАНОЮ:
( Цей пункт скопійовано з блогу . ) Збережена процедура є попередньо складеним планом виконання там, де функцій немає. Функція розбирається та компілюється під час виконання. Зберігаються процедури, зберігаються як псевдо-код у базі даних, тобто у складеній формі.
( Я не впевнений в цьому. )
Збережена процедура має захист і зменшує мережевий трафік, а також ми можемо викликати збережену процедуру в будь-яку ні. заявок одночасно. довідник
Функції зазвичай використовуються для обчислень, коли як процедури зазвичай використовуються для виконання бізнес-логіки.
Функції не можуть впливати на стан бази даних (Заяви, які роблять явну чи неявну фіксацію чи відкат, заборонені у функціонуванні). Зберігаються процедури можуть впливати на стан бази даних, використовуючи посилання комісій тощо
. J.1. Обмеження щодо збережених рутин і тригерів
Функції не можуть використовувати оператори FLUSH, тоді як зберігаються процедури.
Збережені функції не можуть бути рекурсивними, тоді як зберігаються процедури. Примітка: Рекурсивні збережені процедури відключені за замовчуванням, але їх можна активувати на сервері, встановивши систему змінної max_sp_recursion_depth на ненульове значення. Для отримання додаткової інформації див. Розділ 5.2.3, “Змінні системи” .
У межах збереженої функції або тригера не дозволяється змінювати таблицю, яка вже використовується (для читання або запису) заявою, що викликало функцію або тригер. Хороший приклад: як оновити ту саму таблицю при видаленні в MYSQL?
Зауважте : хоча деякі обмеження зазвичай застосовуються до збережених функцій та тригерів, але не для збережених процедур, ці обмеження застосовуються до збережених процедур, якщо вони викликаються в межах збереженої функції або тригера. Наприклад, хоча ви можете використовувати FLUSH у збереженій процедурі, таку збережену процедуру не можна викликати із збереженої функції чи тригера.