在MySQL中,存储过程可以接受调用者的输入参数,同时也能够输出存储过程中产生的结果数据。在MySQL中使用IN表示的参数为输入参数,OUT表示的参数为输出参数,INOUT表示的参数即表示输入参数,也表示输出参数。下面将分别通过实例来介绍这些参数。基本形式如下:
create procedure ([[IN |OUT |INOUT ] 参数名 数据类形...]) begin ... end
IN输入参数
表示该参数的值必须在调用存储过程时指定,存储过程中可以使用这些输入的数据,但是在存储过程中修改该参数的值是不能被返回的。
OUT输出参数
该值在调用的时候需要指定一个变量,用来存储从存储过程中返回的数据。在存储过程中可以任意修改该参数的值且该值能够被存储过程外部获得。
INOUT输入输出参数
这个参数拥有IN和OUT两个参数的功能。即仅是输入参数,又是输出参数。
test表的SQL语句
CREATE TABLE test ( id int(11) NOT NULL, name varchar(100) DEFAULT NULL ); mysql> desc test; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(100) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
test表的数据SQL语句
INSERT INTO test (`id`, `name`) VALUES (1, 'zhangsan'); INSERT INTO test (`id`, `name`) VALUES (2, 'wangwu'); INSERT INTO test (`id`, `name`) VALUES (3, 'lisi'); INSERT INTO test (`id`, `name`) VALUES (4, 'yansxian'); INSERT INTO test (`id`, `name`) VALUES (5, 'fuckyou');
查询数据如下:
mysql> select * from test; +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | wangwu | | 3 | lisi | | 4 | yansxian | | 5 | fuckyou | +----+----------+ 5 rows in set (0.00 sec)
创建一个insertData存储过程,该存储过程存在两个参数:一个接受int的参数(id)和一个varchar类型的参数(name)。然后在存储过程中使用insert
语句将数据存储到test表格中。代码如下:
# 设置新的分隔符 mysql> delimiter // # 创建insertData存储过程 mysql> create procedure insertData(IN n_id int, IN c_name varchar(100)) -> begin -> insert into test (id, name) values (n_id, c_name); -> end -> // Query OK, 0 rows affected (0.00 sec) # 设置新的分隔符 mysql> delimiter ; # 调用存储过程 mysql> call insertData(6, 'test'); Query OK, 1 row affected (0.14 sec) # 查看新增的数据 mysql> select * from test where id=6; +----+------+ | id | name | +----+------+ | 6 | test | +----+------+ 1 row in set (0.00 sec)
上面演示了创建insertData存储过程和调用整个流程。
创建一个getData存储过程,该存储过程存在两个参数:一个输入参数n_id,一个输出参数c_name。根据用户输入的id,在test表中查询与该id相匹配的用名称。如下:
# 设置新的分隔符 mysql> delimiter // # 创建getData存储过程 mysql> create procedure getData(IN n_id int, OUT c_name varchar(100)) -> begin -> select name into c_name from test where id=n_id; -> end -> // Query OK, 0 rows affected (0.00 sec) # 设置新的分隔符 mysql> delimiter ; # 调用存储过程 mysql> call getData(6, @name); Query OK, 0 rows affected (0.00 sec) # 查看数据 mysql> select @name; +-------+ | @name | +-------+ | test | +-------+ 1 row in set (0.00 sec)
创建一个insertData2存储过程,该存储过程存在两个参数,这两个参数都是INOUT类型的参数,一个参数是int类型的n_id,另一个是varchar类型的c_name,用户输出要插入的数据,然后插入成功后,使用n_id返回表格的数据总数,c_name返回成功信息。如下:
# 设置新的分隔符 mysql> delimiter // # 创建getData存储过程 mysql> create procedure insertData2(INOUT n_id int, INOUT c_name varchar(100)) -> begin -> insert into test(id, name) values(n_id, c_name); -> select count(*) into n_id from test; -> set c_name = 'ok'; -> end -> // Query OK, 0 rows affected (0.00 sec) # 设置新的分隔符 mysql> delimiter ; # 调用存储过程 # 设置变量 mysql> set @id=7; Query OK, 0 rows affected (0.00 sec) mysql> set @name='mysql'; Query OK, 0 rows affected (0.00 sec) mysql> call insertData2(@id, @name); Query OK, 0 rows affected (0.13 sec) # 查看数据 mysql> select @id, @name; +------+-------+ | @id | @name | +------+-------+ | 7 | ok | +------+-------+ 1 row in set (0.00 sec)