8-7:MySQL 创建带有多个OUT类型参数的存储过程
创建一个根据年龄删除用户并返回删除的记录数以及剩余的记录数的存储过程,在创建之前,我们先来学习一个函数:
ROW_COUNT():返回上一语句受影响的行数,比如向test数据表中一次插入两条记录:
mysql> INSERT test(username) VALUES('A'), ('B');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT ROW_COUNT();
+-------------+
| ROW_COUNT() |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
接下来开始创建存储过程:
mysql> CREATE PROCEDURE remove2(IN p_age SMALLINT UNSIGNED,OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
-> BEGIN
-> DELETE FROM users WHERE age = p_age;
-> SELECT ROW_COUNT() INTO deleteUsers;
-> SELECT COUNT(id) FROM users INTO userCounts;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
比如删除年龄为21的用户,首先查看一下年龄为21的个数和用户总个数:
mysql> SELECT COUNT(id) FROM users WHERE age = 21;
-> //
+-----------+
| COUNT(id) |
+-----------+
| 3 |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT COUNT(id) FROM users;
-> //
+-----------+
| COUNT(id) |
+-----------+
| 24 |
+-----------+
1 row in set (0.00 sec)
可以看到,用户总个数为24,年龄为21的个数为3个,接下来调用存储过程来删除年龄为21的用户:
mysql> CALL remove2(21,@a,@b);
-> //
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @a , @b;
-> //
+------+------+
| @a | @b |
+------+------+
| 3 | 21 |
+------+------+
1 row in set (0.00 sec)
可以看到删除了3条记录,剩余21条记录