存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
创建储存过程
CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE sp_name([proc_parameter[, …]]) [characteristic …] routine_body
proc_parameter:[IN|OUT|INOUT] param_name type
简单示例1(下方有调用存储过程示例):
CREATE PROCEDURE sp1() SELECT VERSION();
创建了一个名称为sp1的存储过程,功能是查询数据库版本号。
简单示例2:
先切换SQL语句结束符:
DELIMITER &&
创建储存过程(注意参数名与字段名一定不可相同)
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED) BEGIN DELETE FROM users WHERE id = p_id; END &&
接下来可以将之前的结束符切换回来
DELIMITER ;
这样我们就创建了一个名称为removeUserById的存储过程,他需要一个参数id,功能是根据这个id删除用户表中的用户。
简单示例3:
先切换SQL语句结束符
DELIMITER &&
创建储存过程(注意参数名与字段名一定不可相同)
CREATE PROCEDURE removeUserAndReturnUserNUms(IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED) BEGIN DELETE FROM users WHERE id = p_id; SELECT count(id) FROM users INTO userNums; END &&
接下来可以将之前的结束符切换回来
DELIMITER ;
调用储存过程
CALL sp_name([parameter[, …]]) CALL sp_name[()]
执行以上简单示例1:
CALL sp1; CALL sp1();
执行以上简单示例2:
CALL removeUserById(3);
执行以上简单示例3:
CALL removeUserAndReturnUserNums(27, @nums); SELECT @nums;
设置Mysql用户变量
SET @i = 7;
查询全局变量
SELECT @i;
删除储存过程
DROP PROCEDURE [IF EXISTS] sp_name
修改存储过程
ALTER PROCEDURE sp_name [characteristic …] COMMENT 'string' | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER}
注:该方法只能修改部分特性,无法修改过程体,修改过程体需要删除过程后重新创建。并不常用。
储存过程与自定义函数的区别
1.储存过程实现的功能要复杂一些;而函数的针对性更强
2.储存过程可以返回多个值;函数只有一个返回值
3.储存过程一般独立的来执行;而函数可以作为其他SQL语句的组成部分来出现。