关于MySQL存储过程的示例

时间:2012-03-06 06:38:50

标签: mysql sql stored-procedures

您能否在MySQL存储过程中给我一个简单的INOUT示例?

3 个答案:

答案 0 :(得分:5)

MySQL中INOUT使用示例:

从终端运行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 - 调用者传递的值是参数的初始值   程序中的价值