Наиболее общая разница между процедурами и функциями заключается в том, что они вызываются по-разному и для разных целей:
- Процедура не возвращает значение. Вместо этого он вызывается с помощью инструкции 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 подготовленных операторов (приготовьтесь, EXECUTE, DEALLOCATE ГОТОВИТЬ) могут быть использованы в хранимых процедурах, но не сохраняются функции или триггеры. Таким образом, хранимые функции и триггеры не могут использовать Dynamic SQL (где вы строите операторы как строки, а затем выполняете их). (Dynamic SQL in MySQL stored routines)
Некоторые более интересные различия между функцией и хранимой процедурой:
(. Этой точка copied from a blogpost) хранимой процедурой предкомпилированного плана выполнения, где, как функции не являются. Функция Разработана и скомпилирована во время выполнения. Хранимые процедуры, сохраненные как псевдокод в базе данных, то есть скомпилированная форма.
(Я не уверен, что для этой точки.)
хранимой процедуры безопасности и снижает трафик сети , а также мы можем назвать хранимую процедуру в любом нет. из приложений одновременно. reference
Функции обычно используются для вычислений, где процедуры обычно используются для выполнения бизнес-логики.
функции не могут повлиять на состояние базы данных (Заявления, которые делают явной или неявной фиксации или отката запрещены в функции) Принимая во внимание хранимые процедуры могут повлиять на состояние базы данных с помощью фиксации и т.д.
refrence: J.1. Restrictions on Stored Routines and Triggers
Функции не могут использовать операторы FLUSH, тогда как Хранимые процедуры могут выполнять.
Сохраненные функции не могут быть рекурсивными. В то время как хранимые процедуры могут быть. Примечание. Рекурсивные хранимые процедуры по умолчанию отключены, но могут быть включены на сервере, установив системную переменную сервера max_sp_recursion_depth на ненулевое значение. См. Section 5.2.3, “System Variables”, для получения дополнительной информации.
Внутри хранимой функции или триггера не разрешается изменять таблицу, которая уже используется (для чтения или записи) оператором, вызывающим функцию или триггер. Хороший пример: How to Update same table on deletion in MYSQL?
Примечание: что, хотя некоторые ограничения обычно применяются к хранимых функций и триггеров, но не хранимые процедуры, эти ограничения применяются к тем хранимых процедур, если они вызываются из хранимой функции или вызывать. Например, хотя вы можете использовать FLUSH в хранимой процедуре, такую хранимую процедуру нельзя вызывать из хранимой функции или триггера.
Каких ограничений у функции есть? – Fantius
А, я нашел полезную информацию здесь: http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html – Fantius