您能否在MySQL存储过程中给我一个简单的INOUT示例?
答案 0 :(得分:5)
从终端运行mysql -u root -p
。
el@apollo:~$ mysql -u root -p
Enter password:
更改为您的数据库:
mysql> use yourdb;
Reading table information for completion of table and column names
创建一个变量以提供给名为msg
的存储过程。
mysql> select 'ricksays' into @msg;
Query OK, 1 row affected (0.00 sec)
创建存储过程:
mysql> delimiter //
mysql> create procedure foobar (inout msg varchar(100))
-> begin
-> set msg = concat(@msg, " never gonna let you down");
-> end//
设置分隔符:
mysql> delimiter ;
调用存储过程,传入变量。
mysql> call foobar(@msg);
Query OK, 0 rows affected (0.00 sec)
好的,现在看看它是否有效:
mysql> select @msg;
+-----------------------------------+
| @msg |
+-----------------------------------+
| ricksays never gonna let you down |
+-----------------------------------+
1 row in set (0.00 sec)
好的,它有效,它加在一起。因此,您定义了一个变量msg,将该变量传递给名为foobar的存储过程,并且@msg由foobar写入。
INOUT参数的目的是什么。你可以用它来解决问题。
答案 1 :(得分:4)
我认为搜索Google会给你很多例子!!
一个(取自here)
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`get_users` $$
CREATE PROCEDURE `get_users`(
IN firstName VARCHAR(100),
OUT totalUsers INT
)
BEGIN
SELECT COUNT(*) INTO totalUsers
FROM users
WHERE first_name = firstName;
SELECT * FROM users
WHERE first_name = firstName;
END $$
DELIMITER ;
帖子说:
请注意,此存储过程的主体中有两个语句。 第一个选择计数(*)语句计算总人数 谁的名字等于变量firstName。一旦它得到 计数,它将out变量totalUsers设置为该值。
下一个 声明是一个简单的选择。这将为用户选择所有字段 谁的名字等于变量firstName并返回 记录。所以通过调用这个存储过程并传入两个 参数(名字,总数),将返回一个记录集和一个 将设置out变量 - 然后可以查询。
<强>编辑:强>
与MySQL website中一样:
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;
答案 2 :(得分:3)
如果像我一样,混乱是OUT和INOUT之间的区别。使用MySQL认证研究指南中的这些要点澄清了这一点
OUT - 参数在传递时所具有的任何值都被忽略 过程,其在过程中的初始值为NULL
INOUT - 调用者传递的值是参数的初始值 程序中的价值