2010-09-19 3 views
121

Я ищу хранимые процедуры и функции MySQL. Какая разница?MySQL хранимой процедуры против функции, которую я бы использовал, когда?

Они, похоже, похожи, но функция имеет больше ограничений.

Я, скорее всего, ошибаюсь, но, похоже, хранимая процедура может делать все и вся хранимая функция. Почему/когда я буду использовать процедуру против функции?

ответ

77

Вы не можете смешивать хранимые процедуры с обычным SQL, в то время как с сохраненной функцией вы можете.

например. SELECT get_foo(myColumn) FROM mytable недействителен, если get_foo() - это процедура, но вы можете это сделать, если get_foo() является функцией. Цена заключается в том, что функции имеют больше ограничений, чем процедура.

+15

Каких ограничений у функции есть? – Fantius

+9

А, я нашел полезную информацию здесь: http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html – Fantius

5

Сохраненная функция может использоваться в запросе. Затем вы можете применить его к каждой строке или к предложению WHERE.

Процедура выполняется с использованием запроса CALL.

44

Одно существенное отличие состоит в том, что вы можете включать в запросах SQL с function, но stored procedures может быть использовано только с CALL утверждением:

UDF Пример:

CREATE FUNCTION hello (s CHAR(20)) 
    RETURNS CHAR(50) DETERMINISTIC 
    RETURN CONCAT('Hello, ',s,'!'); 
Query OK, 0 rows affected (0.00 sec) 

CREATE TABLE names (id int, name varchar(20)); 
INSERT INTO names VALUES (1, 'Bob'); 
INSERT INTO names VALUES (2, 'John'); 
INSERT INTO names VALUES (3, 'Paul'); 

SELECT hello(name) FROM names; 
+--------------+ 
| hello(name) | 
+--------------+ 
| Hello, Bob! | 
| Hello, John! | 
| Hello, Paul! | 
+--------------+ 
3 rows in set (0.00 sec) 

Sproc Пример:

delimiter // 

CREATE PROCEDURE simpleproc (IN s CHAR(100)) 
BEGIN 
    SELECT CONCAT('Hello, ', s, '!'); 
END// 
Query OK, 0 rows affected (0.00 sec) 

delimiter ; 

CALL simpleproc('World'); 
+---------------------------+ 
| CONCAT('Hello, ', s, '!') | 
+---------------------------+ 
| Hello, World!    | 
+---------------------------+ 
1 row in set (0.00 sec) 
+1

Ваша функция имеет два * возвращения *? Я имею в виду, что это за линия? «ВОЗВРАЩАЕТСЯ ЧАР (50) ДЕТЕРМИНИСТИЧЕСКИЙ»? –

198

Наиболее общая разница между процедурами и функциями заключается в том, что они вызываются по-разному и для разных целей:

  1. Процедура не возвращает значение. Вместо этого он вызывается с помощью инструкции CALL для выполнения операции, такой как изменение таблицы или обработка извлеченных записей.
  2. Функция вызывается внутри выражения и возвращает одно значение непосредственно вызывающему абоненту, который будет использоваться в выражении.
  3. Вы не можете вызывать функцию с помощью инструкции CALL и не вызывать процедуру в выражении.

Синтаксис для обычного создания несколько отличается для процедур и функций:

  1. параметры Процедура может быть определена как только для ввода, только для вывода, или обоих. Это означает, что процедура может передавать значения обратно вызывающему, используя выходные параметры. Доступ к этим значениям можно получить в операторах, которые следуют за инструкцией CALL. Функции имеют только входные параметры. В результате, хотя обе процедуры и функции могут иметь параметры, объявление параметра процедуры отличается от описания функций.
  2. Функции возвращают значение, поэтому в определении функции должно быть предложение 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)

Некоторые более интересные различия между функцией и хранимой процедурой:

  1. (. Этой точка copied from a blogpost) хранимой процедурой предкомпилированного плана выполнения, где, как функции не являются. Функция Разработана и скомпилирована во время выполнения. Хранимые процедуры, сохраненные как псевдокод в базе данных, то есть скомпилированная форма.

  2. (Я не уверен, что для этой точки.)
    хранимой процедуры безопасности и снижает трафик сети , а также мы можем назвать хранимую процедуру в любом нет. из приложений одновременно. reference

  3. Функции обычно используются для вычислений, где процедуры обычно используются для выполнения бизнес-логики.

  4. функции не могут повлиять на состояние базы данных (Заявления, которые делают явной или неявной фиксации или отката запрещены в функции) Принимая во внимание хранимые процедуры могут повлиять на состояние базы данных с помощью фиксации и т.д.
    refrence: J.1. Restrictions on Stored Routines and Triggers

  5. Функции не могут использовать операторы FLUSH, тогда как Хранимые процедуры могут выполнять.

  6. Сохраненные функции не могут быть рекурсивными. В то время как хранимые процедуры могут быть. Примечание. Рекурсивные хранимые процедуры по умолчанию отключены, но могут быть включены на сервере, установив системную переменную сервера max_sp_recursion_depth на ненулевое значение. См. Section 5.2.3, “System Variables”, для получения дополнительной информации.

  7. Внутри хранимой функции или триггера не разрешается изменять таблицу, которая уже используется (для чтения или записи) оператором, вызывающим функцию или триггер. Хороший пример: How to Update same table on deletion in MYSQL?

Примечание: что, хотя некоторые ограничения обычно применяются к хранимых функций и триггеров, но не хранимые процедуры, эти ограничения применяются к тем хранимых процедур, если они вызываются из хранимой функции или вызывать. Например, хотя вы можете использовать FLUSH в хранимой процедуре, такую ​​хранимую процедуру нельзя вызывать из хранимой функции или триггера.

+0

Интересное чтение: [MySQL 5 Хранимые процедуры - Введение - Часть 1] (http://www.datingking.com/) –

+1

@GrijeshChauhan: Что вы имеете в виду, когда говорите, что * «Функция проанализирована и скомпилирована во время выполнения» *? – Pacerier

+0

@Pacerier означает, что функции в MySQL - это что-то вроде скриптов, которые компилируются и выполняются «на лету». Я скопировал его из некоторого [блога] (http://www.phptechnicalgroups.in/2012/10/difference-between-mysql-function-and.html), но не выполнил никаких практических действий для проверки этого поведения. –

16

Различия между хранимой процедурой и определенным пользователем функцией

enter image description here

+7

Полезная таблица. Но этот вопрос задает вопрос о MySQL ... Ваша информация, похоже, исходит из 'http: // doctme' ** sqlserver **' .blogspot.in/' – Pacerier

Смежные вопросы