Най-общата разлика между процедури и функции е, че те се извикват по различен начин и за различни цели:
- Процедура не връща стойност. Вместо това той се извиква с оператор CALL за извършване на операция като промяна на таблица или обработка на извлечените записи.
- Функция се извиква в рамките на израз и връща една стойност директно на повикващия, който да се използва в израза.
- Не можете да извикате функция с израз CALL, нито можете да извикате процедура в израз.
Синтаксисът за създаване на рутинни процедури се различава донякъде за процедурите и функциите:
- Параметрите на процедурата могат да бъдат дефинирани като само за вход, само за изход или и двете. Това означава, че процедурата може да предаде стойности обратно на повикващия, като използва изходни параметри. Тези стойности могат да бъдат достъпни в оператори, които следват оператора CALL. Функциите имат само входни параметри. В резултат на това, въпреки че и процедурите, и функциите могат да имат параметри, декларацията на параметрите на процедурата се различава от тази за функциите.
-
Функциите връщат стойност, така че трябва да има клауза RETURNS в дефиницията на функция, за да посочи типа данни на връщаната стойност. Също така, трябва да има поне един израз RETURN в тялото на функцията, за да върне стойност на повикващия. RETURNS и RETURN не се появяват в дефинициите на процедурите.
-
За да извикате съхранена процедура, използвайте
CALL statement
. За да извикате съхранена функция, обърнете се към нея в израз. Функцията връща стойност по време на оценката на израза. -
Процедура се извиква чрез оператор CALL и може да предава обратно стойности само с помощта на изходни променливи. Функцията може да бъде извикана от вътрешността на оператор, точно както всяка друга функция (тоест чрез извикване на името на функцията) и може да върне скаларна стойност.
-
Указването на параметър като IN, OUT или INOUT е валидно само за ПРОЦЕДУРА. За FUNCTION параметрите винаги се разглеждат като 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 )
Някои по-интересни разлики между FUNCTION и STORED PROCEDURE:
-
(Тази точка е копирано от публикация в блог . )Съхранената процедура е предварително компилиран план за изпълнение, където функциите не са. Функция Анализирана и компилирана по време на изпълнение. Съхранени процедури, съхранени като псевдокод в база данни, т.е. компилиран вид.
-
(Не съм сигурен за тази точка. )
Съхранената процедура има сигурност и намалява мрежовия трафик, а също така можем да извикаме съхранена процедура във всеки номер. от приложения наведнъж. справка -
Функциите обикновено се използват за изчисления, където процедурите обикновено се използват за изпълнение на бизнес логика.
-
Функциите не могат да повлияят на състоянието на базата данни (Изявления, които извършват изрично или неявно извършване на комит или връщане назад, са забранени във функцията)WhereasStored процедури могат да повлияят на състоянието на базата данни, използвайки записване и т.н.
refrence:J.1. Ограничения за съхранени рутинни програми и тригери -
Функциите не могат да използват FLUSH оператори, докато запомнените процедури могат.
-
Съхранените функции не могат да бъдат рекурсивни, докато съхранените процедури могат да бъдат. Забележка:Рекурсивните съхранени процедури са деактивирани по подразбиране, но могат да бъдат разрешени на сървъра чрез задаване на системната променлива на max_sp_recursion_depth на сървъра на ненулева стойност. Вижте Раздел 5.2.3 , „Системни променливи“ , за повече информация.
-
В рамките на съхранена функция или тригер не е разрешено да се променя таблица, която вече се използва (за четене или запис) от израза, който е извикал функцията или тригера. Добър пример:Как да актуализирам същата таблица при изтриване в MYSQL?
Забележка :че въпреки че някои ограничения обикновено се прилагат към съхранените функции и тригери, но не и към съхранените процедури, тези ограничения се прилагат към съхранените процедури, ако са извикани от съхранена функция или тригер. Например, въпреки че можете да използвате FLUSH в съхранена процедура, такава съхранена процедура не може да бъде извикана от съхранена функция или тригер.