首页 > 数据库 > MySQL > 正文

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

2024-07-24 12:59:51
字体:
来源:转载
供稿:网友

存储过程

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表