MySQL存储过程
MySQL的存储过程和Oracle的存储过程实现的功能基本是一样的,但是存储过程的实现语法有些许不一样。
参数:三种,输入类型in,输出类型out,输入输出类型inout
创建存储过程时要通过DELIMITER语句修改定界符。
存储过程将语句体包含在begin…end中
存储过程通过call调用
首先建表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`sex` varchar(255) DEFAULT '' COMMENT '性别',
PRIMARY KEY (`id`)
)
1.创建一个in参数的存储过程
模板
DELIMITER //
CREATE PROCEDURE 过程名(IN 属性名 属性类型)
BEGIN
执行语句
END;
//
DELIMITER ;
样例
DELIMITER //
CREATE PROCEDURE UPDATE_STUDENT(IN IN_AGE INT)
BEGIN
UPDATE student SET AGE=IN_AGE;
COMMIT;
END;
//
DELIMITER ;
执行该存储过程
CALL UPDATE_STUDENT(20)
2.创建一个out参数的存储过程
模板
DELIMITER //
CREATE PROCEDURE UPDATE_STUDENTS(in 属性名1 属性类型, out 属性名2 属性类型)
BEGIN
执行语句
END;
//
DELIMITER ;
样例
DELIMITER //
CREATE PROCEDURE UPDATE_STUDENTS(in in_age int, out out_age int)
BEGIN
update students set age=in_age;
select age into out_age from student where id=1;
commit;
END;
//
DELIMITER ;
执行该存储过程
SET @p_out=1;
CALL UPDATE_STUDENTS(22,@p_out);
select @p_out
3.创建一个in out参数的存储过程
模板
DELIMITER //
CREATE PROCEDURE 方法名(inout 属性名1 属性类型,inout 属性名2 属性类型....)
BEGIN
执行语句
END;
//
DELIMITER ;
样例
DELIMITER //
CREATE PROCEDURE swap(inout param1 int,inout param2 int)
BEGIN
DECLARE param int;
set param=param1;
set param1=param2;
set param2=param;
END;
//
DELIMITER ;
执行该存储过程
SET @param1=1;
SET @param2=2;
CALL swap(@param1,@param2);
select @param1,@param2
4.声明变量
局部变量定义
DECLARE 变量名1[,变量名2…] 数据类型 [默认值];
DECLARE x1 VARCHAR(5) DEFAULT ‘xxx’;
用户变量定义
SET 变量名 = 变量值 [,变量名= 变量值 …]
SET @para=1;
DECLARE是用于定义局部变量,在过程体内使用,set是定义全局变量,可在过程体内使用,也可在过程体外使用,全局变量慎用,之前的样例中只是为了展示数据才采用全局变量@
5.如何修改存储过程
MySQL还不提供对已存在的存储过程的代码修改
如果,一定要修改存储过程,必须先将存储过程删除之后重新编写代码
DROP PROCEDURE IF EXISTS proc3;
DELIMITER //
CREATE PROCEDURE proc3(XXXX)
BEGIN
执行语句
END ;
//
DELIMITER ;
6.条件判断
模板
DELIMITER //
CREATE PROCEDURE 过程名(参数列表parameter)
BEGIN
DECLARE var int;
SET var=parameter+1;
IF var=0 THEN
UPDATE student SET age=age+1;
ELSE
UPDATE student SET age=age+2;
END IF ;
END ;
//
DELIMITER ;
样例
DELIMITER //
CREATE PROCEDURE ageUpdate(IN parameter int)
BEGIN
DECLARE var int;
SET var=parameter+1;
IF var=0 THEN
UPDATE student SET age=age+1;
ELSE
UPDATE student SET age=age+2;
END IF ;
END ;
//
DELIMITER ;
执行该存储过程
call ageUpdate(-1)
7.循环条件
模板
DELIMITER //
CREATE PROCEDURE batchInsert ()
BEGIN
DECLARE v INT;
SET v=0;
LOOP_LABLE:LOOP
执行语句
SET v=v+1;
IF 循环条件 THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;
END;
//
DELIMITER ;
样例
DELIMITER //
CREATE PROCEDURE batchInsert ()
BEGIN
DECLARE v INT;
SET v=0;
LOOP_LABLE:LOOP
INSERT INTO student(name,age,sex) VALUES('xx','10','男');
SET v=v+1;
IF v >=5 THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;
END;
//
DELIMITER ;
执行结果
call batchInsert()
参考资料
https://www.yiibai.com/mysql/stored-procedure.html#article-start
https://www.cnblogs.com/mark-chan/p/5384139.html