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

3/7/2017来源:SQL技巧人气:1504

存储过程

存储过程是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语句是设置不同类型的变量,包括会话变量和全局变量