Самое общее различие между процедурами и функциями заключается в том, что они вызываются по-разному и для разных целей:
- Процедура не возвращает значение. Вместо этого он вызывается с помощью оператора CALL для выполнения такой операции, как изменение таблицы или обработка полученных записей.
- Функция вызывается внутри выражения и возвращает одно значение непосредственно вызывающей стороне для использования в выражении.
- Вы не можете вызывать функцию с оператором CALL и не можете вызывать процедуру в выражении.
Синтаксис для рутинного создания несколько отличается для процедур и функций:
- Параметры процедуры могут быть определены как только входные, только выходные или оба. Это означает, что процедура может передавать значения обратно вызывающей стороне, используя выходные параметры. Эти значения могут быть доступны в операторах, следующих за оператором CALL. Функции имеют только входные параметры. В результате, хотя и процедуры, и функции могут иметь параметры, объявление параметров процедуры отличается от описания для функций.
Функции возвращают значение, поэтому в определении функции должно быть предложение 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) могут использоваться в хранимых процедурах, но не в хранимых функциях или триггерах. Таким образом, хранимые функции и триггеры не могут использовать динамический SQL (где вы строите операторы как строки, а затем выполняете их). (Динамический SQL в хранимых подпрограммах MySQL)
Еще несколько интересных отличий между FUNCTION и STORED PROCEDURE:
( Этот пункт скопирован из поста в блоге . ) Хранимая процедура - это предварительно скомпилированный план выполнения, в котором функции отсутствуют. Функция анализируется и компилируется во время выполнения. Хранимые процедуры, хранящиеся в виде псевдокода в базе данных, т.е. скомпилированные формы.
( Я не уверен в этом. )
Хранимая процедура имеет безопасность и снижает сетевой трафик, а также мы можем вызвать хранимую процедуру в любом нет. приложений одновременно. ссылка
Функции обычно используются для вычислений, где процедуры обычно используются для выполнения бизнес-логики.
Функции не могут влиять на состояние базы данных (операторы, которые выполняют явную или неявную фиксацию или откат, запрещены в функции), в то время как хранимые процедуры могут влиять на состояние базы данных с помощью фиксации и т. Д.
Refrence: J.1. Ограничения на хранимые процедуры и триггеры
Функции не могут использовать операторы FLUSH, тогда как хранимые процедуры могут.
Хранимые функции не могут быть рекурсивными, тогда как хранимые процедуры могут быть. Примечание. Рекурсивные хранимые процедуры по умолчанию отключены, но их можно включить на сервере, задав для системной переменной сервера max_sp_recursion_depth ненулевое значение. См. Раздел 5.2.3, «Системные переменные» , для получения дополнительной информации.
Внутри хранимой функции или триггера запрещено изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер. Хороший пример: как обновить ту же таблицу при удалении в MYSQL?
Обратите внимание : хотя некоторые ограничения обычно применяются к хранимым функциям и триггерам, но не к хранимым процедурам, эти ограничения действительно применяются к хранимым процедурам, если они вызываются из хранимой функции или триггера. Например, хотя вы можете использовать FLUSH в хранимой процедуре, такая хранимая процедура не может быть вызвана из хранимой функции или триггера.