MySQL存储过程中OUT
的目的是什么?
如果我有一个简单的存储过程,如下所示:
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;
哪个会给我一个名字而不是返回的所有内容?
我尝试使用谷歌搜索,但显然没有向谷歌提出正确的问题以获得明确的答案。
答案 0 :(得分:6)
对于每个OUT或INOUT参数,传递用户定义的变量 调用该过程的CALL语句,以便您可以获取它 程序返回时的值。如果您正在调用该程序 从另一个存储过程或函数中,您也可以传递一个 例程参数或本地例程变量作为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)
答案 1 :(得分:5)
是的,你是对的,通过第二次通话,你现在只能获得这个名字。
许多人的Out-Parameters通常被认为是不好的做法,但是如果你想要一个可以在通话后使用的价值(也可以通过功能显然计算),它们可以很方便。在大多数情况下,有一种更好的方法可以在不使用out-parameters的情况下实现您想要的效果。
然而,如果你愿意的话,唯一的“优点”就是你在变量中有一个值而不是结果集,如果你决定在你的sql或者你想要使用的sql中进一步使用那个值,那么它可能看起来更方便它
因此在大多数情况下,您应该不使用out参数,而是使用函数。 如果你有返回结果集和out-parameters的过程,试着将它们分解成更小的函数/过程以避免out-parameters,因为它只是不好阅读和维护;)
答案 2 :(得分:2)
一些文档:http://dev.mysql.com/doc/refman/5.0/en/call.html也许它会有所帮助,引用:
要使用OUT或INOUT参数从过程中获取值, 通过用户变量传递参数,然后检查 过程返回后变量的值。 (如果你打电话的话 从另一个存储过程或函数中的过程,你 也可以将例程参数或本地例程变量作为IN传递 或INOUT参数。)对于INOUT参数,初始化其值 在将其传递给程序之前。以下程序有一个OUT 过程设置为当前服务器版本的参数,以及 一个INOUT值,该过程从其当前值开始递增1 值:
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;
答案 3 :(得分:0)