介绍
语法
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体
分隔符
MySQL默认以";“为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个”//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。
参数
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
IN:输入模式,参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。
OUT:输出模式,该值可在存储过程内部被改变,并可返回。
INOUT:输入输出模式,调用时指定,并且可被改变和返回。
过程体
过程体的开始与结束使用BEGIN与END进行标识。
实例
实例的表结构:
年级表:grade
学生表:user
输入模式(默认)
- 定义
目的:传入一个数字参数,查询出user表中gid为该参数的人员姓名和年级名称
DELIMITER $$ #修改结束标志,默认为分号
CREATE
PROCEDURE comein(in g INT) #定义存储过程名称和参数(in可以省略)
BEGIN
SELECT `uname`,`gname` FROM `user` JOIN `grade` ON `user`.`gid` = `grade`.id WHERE `gid` = g;
END$$
DELIMITER ; #结束标志改为默认分号
- 调用
call comein(1);
输出模式
- 定义
目的:根据学生编号(snum)查询出学生姓名
DELIMITER $$
CREATE
PROCEDURE `getout`(s VARCHAR(20),OUT n VARCHAR(20)) #OUT关键字
BEGIN
SELECT uname INTO n FROM `user` WHERE snum = s; #INTO关键字
END$$
DELIMITER ;
- 调用
call getout('No10001',@uname);
select @uname
输入输出模式
- 定义
目的:根据学生编号(snum)查询出学生姓名
DELIMITER $$
CREATE
PROCEDURE outin(INOUT n VARCHAR(20)) #INOUT关键字
BEGIN
SELECT uname INTO n FROM `user` WHERE snum = n; #INTO关键字
END$$
DELIMITER ;
- 调用
SET @na = 'No10002';
CALL outin(@na);
SELECT @na;