osh*_*nen 4 php mysql stored-procedures
OUTMySQL存储过程的目的是什么?
如果我有一个简单的存储过程,如下所示:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
IN iID int
)
BEGIN
select * from table1 where id = iID;
END
Run Code Online (Sandbox Code Playgroud)
这将通过运行给我所有我想要的结果:
call new_routine(7);
Run Code Online (Sandbox Code Playgroud)
那么我为什么要/需要使用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
Run Code Online (Sandbox Code Playgroud)
并称之为这样
call new_routine(7, @name);
select @name;
Run Code Online (Sandbox Code Playgroud)
哪个会给我一个名字,而不是返回的行中的所有内容?
我已经尝试过谷歌搜索,但显然没有向谷歌提出正确的问题以获得明确的答案.
正如MySQL doc所引用的那样 PROCEDURE
对于每个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)
Run Code Online (Sandbox Code Playgroud)
mysql> delimiter ;
Run Code Online (Sandbox Code Playgroud)
mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
是的,你是对的,通过第二次通话你现在只能获得这个名字.
对于许多人来说,Out-Parameters通常被认为是不好的做法,但是如果你想要一个可以在调用之后使用的值(它们也可以通过函数显然计算),它们可以很方便.在大多数情况下,有一种更好的方法可以在不使用out-parameters的情况下实现您的需求.
但是,如果您愿意,唯一的"优势"是您在变量中有一个值而不是结果集,如果您决定在您的sql中使用该值,或者您希望使用它,那么它可能看起来更方便.
所以在大多数情况下你应该不使用out-parameters,而是使用函数.如果你有返回结果集和out-parameters的过程,试着将它们分解成更小的函数/过程以避免out-parameters,因为它只是不好阅读和维护;)
| 归档时间: |
|
| 查看次数: |
5658 次 |
| 最近记录: |