2013-03-26 7 views
4

Какова цель OUT в хранимых процедурах MySQL?Какова цель OUT в хранимых процедурах MySQL?

Если у меня есть простая хранимая процедура, которая выглядит следующим образом:

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int 
) 
BEGIN 
    select * from table1 where id = iID; 
END 

Это дало бы мне все результаты, я хочу, запустив:

call new_routine(7); 

Так почему я хочу/необходимость используйте OUT?

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int, 
    OUT vName varchar(100) 
) 
BEGIN 
    select name into vName from table1 where id = iID; 
END 

и назвать его, как этот

call new_routine(7, @name); 
select @name; 

который даст мне только имя, а не все из строки возвращаются?

Я пробовал Google, но явно не спросил у Google правильный вопрос, чтобы получить четкий ответ.

ответ

5

Да, вы правы, с этим вторым звонком вы получите только имя.

Out-Parameters для многих людей, как правило, считается плохой практикой, но они могут быть удобными, если вы хотите получить значение, с которым вы можете работать после вызова (что также может быть рассчитано функцией явно). И в большинстве случаев есть лучший способ добиться того, чего вы хотите, не используя out-parameters.

Однако единственное «преимущество», если вы хотите, состоит в том, что у вас есть значение в переменной вместо результирующего набора, которое может показаться более удобным, если вы решите использовать только это значение далее в своем sql или где бы вы ни хотели работать с этим.

Так что в большинстве случаев вы не должны использовать out-parameters, вместо этого используйте функции. Если у вас есть процедуры, которые возвращают наборы результатов И out-parameters пытаются разбить их на более мелкие функции/процедуры, чтобы избежать out-parameters, потому что это просто нехорошо читать и поддерживать;)

2

Некоторая документация: http://dev.mysql.com/doc/refman/5.0/en/call.html может быть, это поможет, цитата:

Чтобы вернуть значение из процедуры с использованием OUT или параметра INOUT, передать параметр с помощью переменной пользователя, а затем проверить значение переменной после процедуры возвращается. (Если вы вызываете процедуру из другой хранимой процедуры или функции, вы можете также передать обычный параметр или локальную рутинную переменную как параметр IN или INOUT.) Для параметра INOUT, инициализируйте его значение , прежде чем передать его процедура. Следующая процедура имеет OUT параметра, что процедура устанавливает к текущей версии сервера, и значения INOUT, что приращения процедуры по одному из его текущего значения:

CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT) 
BEGIN 
    # Set value of OUT parameter 
    SELECT VERSION() INTO ver_param; 
    # Increment value of INOUT parameter 
    SET incr_param = incr_param + 1; 
END; 
+0

Так что это CALL-передача, если OUT и INOUT не используются? Разве это не передача значений без использования OUT и INOUT? Например, первая хранимая процедура в моем вопросе не использует OUT или INOUT, но CALL получает обратные значения? Я не понимаю. – oshirowanen

6

Как цитата из MySQL дока на PROCEDURE

Для каждого OUT или параметра INOUT, передать пользовательскую переменную в операторе CALL, , который вызывает процедуру, так что вы можете получить его значение когда й e процедура возвращается. Если вы вызываете процедуру из другой хранимой процедуры или функции, вы также можете передать параметр процедуры или локальную рутинную переменную в качестве параметра IN или INOUT .


И позже, пример:

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) 
    -> BEGIN 
    -> SELECT COUNT(*) INTO param1 FROM t; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 

mysql> CALL simpleproc(@a); 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @a; 
+------+ 
| @a | 
+------+ 
| 3 | 
+------+ 
1 row in set (0.00 sec) 
+0

Итак, если CALL передается обратно, если OUT и INOUT не используются? Разве это не передача значений без использования OUT и INOUT? Например, первая хранимая процедура в моем вопросе не использует OUT или INOUT, но CALL получает обратные значения? Я не понимаю. – oshirowanen

+0

@oshirowanen Возможно, я неверно истолковал ваш вопрос. Не могли бы вы объяснить. 'IN' - это передача значения функции/процедуры. 'OUT' будет использоваться только в' ПРОЦЕДУРЕ', и вы можете использовать его для возврата пользовательских данных. 'INOUT' работает в обоих направлениях. – hjpotter92

+0

В принципе, я не понимаю, почему 'OUT' существует, если CALL получает обратно данные без использования' OUT'. – oshirowanen

0

Использование ключевого слова OUT указано в следующей статье

13.2.1. CALL Syntax

ВЫЗОВ может передать обратно значения в вызывающую с использованием параметров, которые объявлены как параметры OUT или INOUT.

+0

Так что CALL передается обратно, если OUT и INOUT не используются? Разве это не передача значений без использования OUT и INOUT? Например, первая хранимая процедура в моем вопросе не использует OUT или INOUT, но CALL получает обратные значения? Я не понимаю. – oshirowanen