MySQL数据库——初涉'存储过程'基本操作(无参,IN,OUT)与变量术语基础概念

存储过程

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理,
存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量,以及进行流程控制,
存储过程可以接收参数,可以接收输入类型的参数,也可以接收输出类型的参数,
并且可以存在多个返回值,存储过程的效率比一般SQL执行的效率要高

存储过程的优点

1.增强SQL语句的功能和灵活性
2.实现较快的执行速度
3.减少网络流量

--创建存储过程
CREATE [DEFINER = { user|CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body;

--调用存储过程
CALL sp_name([parameter[,...]]);
CALL sp_name[()];

--修改存储过程(能修改的内容十分有限,尤其是无法修改过程体)
ALTER PROCEDURE sp_name [characteristic ...];

--删除存储过程(若是修改过程体,可直接删除存储过程,再重建)
DROP PROCEDURE [IF EXISTS] sp_name;

--proc_parameter: [IN|OUT|INOUT] param_name type
/*
IN:表示该参数的值必须在调用存储过程时指定;
OUT:表示该参数的值可以被存储过程改变,并且可以返回;
INOUT:跟 OUT 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 INOUT 参数传递值给存储过程;
*/
--characteristic:特性
COMMENT 'string'
|{CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA}
|SQL SECURITY {DEFINER | INVOKER}
/*
COMMENT:注释
CONTAINS SQL:包含SQL语句,但不包含读或写数据的语句
NO SQL:不包含SQL语句
READS SQL DATA:包含读数据的语句
MODIFIES SQL DATA:包含写数据的语句
SQL SECURITY {DEFINER | INVOKER}:指明谁有权限来执行
*/

--过程体
/*
1.过程体由合法的SQL语句构成;
2.过程体可以是‘任意’SQL语句(不能创建数据库,不能创建数据表,主要是对于数据的增删改查,以及多表连接等等);
3.过程体如果为复合结构则使用BEGIN...END语句;
4.复合结构可以包含声明,循环,控制结构;
*/

1.创建不带参数的存储过程

--存储过程示例:
CREATE PROCEDURE sp1() SELECT VERSION();
--就算不带由参数,还是需要加上sp1后面的小括号

--调用存储过程(以下两种格式都可)
CALL sp1;
CALL sp1();

2.创建带有IN类型参数的存储过程

--示例(假设前提条件都已满足):
DELIMITER //  --修改定界符
CREATE PROCEDURE rmUserById(IN p_id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;  --id为数据表中的记录,p_id为待接收的参数
END
//

--调用存储过程
DELIMITER ;  --将定界符改为;
CALL rmUserById(2);

3.创建带有IN和OUT类型参数的存储过程

--示例(假设前提条件都已满足):
DELIMITER //
CREATE PROCEDURE rmUserAndRtUserNums(IN p_id INT UNSIGNED,OUT u_nums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT count(id) FROM users INTO u_nums;  --INTO,将SELECT结果放入一个变量中
END
//

--调用存储过程
DELIMITER ;  --将定界符改为;
CALL rmUserAndRtUserNums(2,@nums);  --此时,返回值就在@nums中
SELECT @nums;  --查看返回值

--关于本例中这种参数形式,请看本文第五节

4.创建带有多个OUT类型参数的存储过程

SELECT ROW_COUNT();
--ROW_COUNT,得到插入、删除、更新的被影响的记录总数
--示例(假设前提条件都已满足):
DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(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;  --INTO,将SELECT结果放入一个变量中
SELECT COUNT(id) FROM users INTO userCounts;
END
//

--调用存储过程
DELIMITER ;  --将定界符改为;
CALL rmUserByAgeAndRtInfos(20,@delUser,@userCou);
SELECT @delUser,@userCou;

5.变量术语基础概念

1.用户变量:以”@”开始,形式为”@变量名”
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
2.全局变量:定义示例,SET @i = 7;对所有客户端生效。只有具有super权限才可以设置全局变量
3.会话变量:只对连接的客户端有效。
4.局部变量:作用范围在 BEGIN 到 END 语句块之间。在该语句块里设置的变量
DECLARE语句专门用于定义局部变量。SET语句是设置不同类型的变量,包括会话变量和全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值