【转】《与MySQL的零距离接触》第八章:MySQL存储过程 (8-5:MySQL 创建带有IN类型参数的存储过程)

8-5:MySQL 创建带有IN类型参数的存储过程

将删除记录封装成存储过程:

mysql> CREATE PROCEDURE removeUSerByID(IN id INT UNSIGNED)
    -> BEGIN
    -> DELETE FROM users WHERE id = id;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

可以看到即使只有一条语句,也可以使用BEGIN和END

这里的IN指的是:表示该参数的值必须在调用存储过程时指定,参数名为id,数据类型为INT UNSIGNED

调用存储过程:

mysql> DELIMITER ;
mysql> CALL removeUserByID(3);
Query OK, 8 rows affected (0.00 sec)

mysql> SELECT * FROM users;
Empty set (0.00 sec)

为什么我们想删除的是id为3的记录,而实际上却把整个数据表记录都删除了呢?

这是因为虽然我们认为在封装的时候DELETE FROM users WHERE id = id; 第一个id指的的是数据表中的字段,而第二个id和IN后面的id都是指以后需要传递的参数,但是数据库并不这样认为,它无法区分这两个id的不同含义,所以id = id 默认为真,直接删除了整张表

所以给参数的时候,参数名不能和数据表中的记录名相同,所以需要修改存储过程

但是修改存储过程的时候注意不能修改过程体,想要修改过程体只能删除存储过程再进行重建,删除存储过程的语法结构:

DROP PROCEDURE [IF EXISTS] sp_name

我们删除刚才创建的存储过程:

mysql> DROP PROCEDURE removeUserByID;
Query OK, 0 rows affected (0.00 sec)

重新插入一些记录(因为教程中没有提供data.sql,所以我就自己做了十几条记录,大家可以直接复制下面的语句插入):

INSERT USERS(username,password,age,sex) VALUES('A','202cb962ac59075b964b07152d234b70','21','0');
INSERT USERS(username,password,age,sex) VALUES('B','c8ffe9a587b126f152ed3d89a146b445','23','0');
INSERT USERS(username,password,age,sex) VALUES('C','3def184ad8f4755ff269862ea77393dd','20','1');
INSERT USERS(username,password,age,sex) VALUES('D','ffeed84c7cb1ae7bf4ec4bd78275bb98','20','0');
INSERT USERS(username,password,age,sex) VALUES('E','a5481cd6d7517aa3fc6476dc7d9019ab','21','0');
INSERT USERS(username,password,age,sex) VALUES('F','42ae1544956fbe6e09242e6cd752444c','20','1');
INSERT USERS(username,password,age,sex) VALUES('G','9958517b2a48851d2ada1c76c88cfc56','22','0');
INSERT USERS(username,password,age,sex) VALUES('H','fe2610f1476e7027b25bd1dd132110c5','20','0');
INSERT USERS(username,password,age,sex) VALUES('I','0723dfd10075aee37a1804a728349dc3','20','1');
INSERT USERS(username,password,age,sex) VALUES('J','a35aea60fe097c885568babb48ee7d1e','23','0');
INSERT USERS(username,password,age,sex) VALUES('K','157eda051e0176607c170a16e1c37ee1','20','0');
INSERT USERS(username,password,age,sex) VALUES('L','8d7354980e33bdd1e7e53a019b61321c','20','0');
INSERT USERS(username,password,age,sex) VALUES('M','212f992316d58d06d2cdc35020fa9dac','23','1');
INSERT USERS(username,password,age,sex) VALUES('N','6512bd43d9caa6e02c990b0a82652dca','25','0');
INSERT USERS(username,password,age,sex) VALUES('O','1c222c9181f2dfcc08ca42e869cf88c8','20','0');
INSERT USERS(username,password,age,sex) VALUES('P','4031d16f69847588e8c8cb7950a72a47','28','1');
INSERT USERS(username,password,age,sex) VALUES('Q','8fb5a3e7338ce951971d69be27fc5210','20','0');
INSERT USERS(username,password,age,sex) VALUES('R','4e4d6c332b6fe62a63afe56171fd3725','27','0');

然后重新创建存储过程:

mysql> CREATE PROCEDURE removeUSerByID(IN p_id INT UNSIGNED)
    -> BEGIN
    -> DELETE FROM users WHERE id = p_id;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

然后删除id为34的记录:

mysql> CALL removeUserBYID(34);
    -> //
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM users WHERE id = 34;
    -> //
Empty set (0.00 sec)

可以看到删除成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值