Я смотрю на хранимые процедуры и функции MySQL. В чем реальная разница?
Они кажутся похожими, но функция имеет больше ограничений.
Я, вероятно, ошибаюсь, но кажется, что хранимая процедура может сделать все, и больше может хранимая функция. Почему / когда я использовал бы процедуру против функции?
Самое общее различие между процедурами и функциями заключается в том, что они вызываются по-разному и для разных целей:
Синтаксис для рутинного создания несколько отличается для процедур и функций:
Функции возвращают значение, поэтому в определении функции должно быть предложение RETURNS, чтобы указать тип данных возвращаемого значения. Кроме того, в теле функции должен быть хотя бы один оператор RETURN для возврата значения вызывающей стороне. ВОЗВРАТ и ВОЗВРАТ не отображаются в определениях процедур.
Чтобы вызвать хранимую процедуру, используйте
CALL statement
. Чтобы вызвать сохраненную функцию, обратитесь к ней в выражении. Функция возвращает значение во время вычисления выражения.Процедура вызывается с помощью оператора CALL и может только возвращать значения, используя выходные переменные. Функция может быть вызвана из оператора точно так же, как и любая другая функция (то есть путем вызова имени функции), и может возвращать скалярное значение.
Указание параметра как IN, OUT или INOUT действительно только для ПРОЦЕДУРЫ. Для ФУНКЦИИ параметры всегда рассматриваются как параметры IN.
Если перед именем параметра не указано ключевое слово, по умолчанию это параметр IN. Параметрам для сохраненных функций не предшествуют IN, OUT или INOUT. Все параметры функции рассматриваются как параметры IN.
Чтобы определить хранимую процедуру или функцию, используйте CREATE PROCEDURE или CREATE FUNCTION соответственно:
Расширение MySQL для хранимой процедуры (не функции) заключается в том, что процедура может генерировать набор результатов или даже несколько наборов результатов, которые вызывающая сторона обрабатывает так же, как результат оператора SELECT. Однако содержимое таких наборов результатов нельзя использовать непосредственно в выражении.
Хранимые подпрограммы (относящиеся как к хранимым процедурам, так и к хранимым функциям) связаны с конкретной базой данных, как таблицы или представления. Когда вы удаляете базу данных, любые сохраненные подпрограммы в базе данных также удаляются.
Хранимые процедуры и функции не разделяют одно и то же пространство имен. Можно иметь процедуру и функцию с одинаковым именем в базе данных.
В хранимых процедурах можно использовать динамический SQL, но не в функциях или триггерах.
Еще несколько интересных отличий между FUNCTION и STORED PROCEDURE:
( Этот пункт скопирован из поста в блоге . ) Хранимая процедура - это предварительно скомпилированный план выполнения, в котором функции отсутствуют. Функция анализируется и компилируется во время выполнения. Хранимые процедуры, хранящиеся в виде псевдокода в базе данных, т.е. скомпилированные формы.
( Я не уверен в этом. )
Хранимая процедура имеет безопасность и снижает сетевой трафик, а также мы можем вызвать хранимую процедуру в любом нет. приложений одновременно. ссылка
Функции обычно используются для вычислений, где процедуры обычно используются для выполнения бизнес-логики.
Функции не могут влиять на состояние базы данных (операторы, которые выполняют явную или неявную фиксацию или откат, запрещены в функции), в то время как хранимые процедуры могут влиять на состояние базы данных с помощью фиксации и т. Д.
Refrence: J.1. Ограничения на хранимые процедуры и триггеры
Функции не могут использовать операторы FLUSH, тогда как хранимые процедуры могут.
Хранимые функции не могут быть рекурсивными, тогда как хранимые процедуры могут быть. Примечание. Рекурсивные хранимые процедуры по умолчанию отключены, но их можно включить на сервере, задав для системной переменной сервера max_sp_recursion_depth ненулевое значение. См. Раздел 5.2.3, «Системные переменные» , для получения дополнительной информации.
Внутри хранимой функции или триггера запрещено изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер. Хороший пример: как обновить ту же таблицу при удалении в MYSQL?
Обратите внимание : хотя некоторые ограничения обычно применяются к хранимым функциям и триггерам, но не к хранимым процедурам, эти ограничения действительно применяются к хранимым процедурам, если они вызываются из хранимой функции или триггера. Например, хотя вы можете использовать FLUSH в хранимой процедуре, такая хранимая процедура не может быть вызвана из хранимой функции или триггера.
источник
Существенным отличием является то, что вы можете включить функцию в ваши запросы SQL, но хранимые процедуры можно вызывать только с помощью
CALL
оператора:Пример UDF:
Пример Sproc:
источник
RETURNS CHAR(50) DETERMINISTIC
?RETURNS CHAR(50)
состоянии , какой тип данных будет возвращено. ЭтоRETURN CONCAT(...
данные, которые возвращаются. Оба необходимы.DETERMINISTIC
Необходимо , чтобы состояние , что основные данные не будут изменены.Хранимая функция может быть использована в запросе. Затем вы можете применить его к каждой строке или в предложении WHERE.
Процедура выполняется с использованием запроса CALL.
источник
Хранимая процедура может вызываться рекурсивно, но хранимая функция не может
источник