MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应
用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
存储过程的参数类型可以是IN
、OUT
和INOUT
。根据这点分类如下:
注意:IN、OUT、INOUT 都可以在一个存储过程中带多个
。
CREATE PROCEDURE 存储过程名
(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
存储过程体
END
这个结构就类似于Java中的方法定义了
修饰符 返回类型 方法名(参数类型 参数名,...)
{
方法体;
}
语法结构说明:
DELIMITER $
CREATE PROCEDURE 存储过程名
(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
sql语句1;
sql语句2;
END $
DELIMITER ;
案例1:创建存储过程 get_max_grade(),查看考试成绩的最高分
DELIMITER //
CREATE PROCEDURE get_max_grade()
LANGUAGE SQl # 存储过程由SQL组成
NOT DETERMINISTIC # 结果不确定
CONTAINS SQL # 当前存储过程子程序包含SQL语句
SQL SECURITY DEFINER # 当前创建的用户才能执行
COMMENT '查看最高成绩' # 注释
BEGIN
select max(grade) from score;
END //
DELIMITER ;
案例2:创建存储过程get_min_grade(),查看“score”表的最低薪资值。并将最低薪资通过OUT参数“ms”输出
DELIMITER //
CREATE PROCEDURE get_min_grade(OUT ms int)
BEGIN
select min(grade) into ms from score;
END //
DELIMITER ;
调用过程
CALL get_min_grade(@ms);
查看变量
SELECT @ms ;
案例3:创建存储过程get_someone_sumgrade(),查看“score”表的某个学员的总成绩,并用IN参数stuid输入员工姓名
DELIMITER //
CREATE PROCEDURE get_someone_sumgrade(IN stuid int)
BEGIN
select sum(grade) from score where stu_id = stuid;
END //
DELIMITER ;
调用过程
CALL get_someone_sumgrade(906) ;
案例4:创建存储过程get_someone_sumgrade2(),查看“score”表的某个学员的总成绩,并用IN参数stuid输入员工姓名.并用OUT参数sumgrade来输出总成绩
DELIMITER //
CREATE PROCEDURE get_someone_sumgrade2(IN stuid int,OUT sumgrade int)
BEGIN
select sum(grade) into sumgrade from score where stu_id = stuid;
END //
DELIMITER ;
调用过程
CALL get_someone_sumgrade2(901,@sumgrade);
查看变量
SELECT @sumgrade ;
案例5:创建存储过程show_student_department(),查询某个学员的院系,并用INOUT参数“stu_x”输入学员姓名,输出院系名称
DELIMITER //
CREATE PROCEDURE show_student_department(INOUT stu_x VARCHAR(20))
BEGIN
select department into stu_x from student where name = stu_x;
END //
DELIMITER ;
调用过程
SET @stu_x := '张三';
CALL show_student_department(@stu_x);
查看变量
SELECT @stu_x ;
CALL 存储过程名称(实参列表);
针对存储过程不同类型的参数,调用的方式也有区别:
调用in模式的参数
CALL sp1('值') ;
调用out模式的参数
SET @paras ;
CALL sp1(@paras) ;
SELECT @paras ;
调用INOUT模式的参数
SET @paras = 值;
CALL sp1(@paras) ;
SELECT @paras ;
如果你用的是 Navicat 工具,那么在编写存储过程的时候,Navicat 会自动设置
DELIMITER
为其他
符号,我们不需要再进行 DELIMITER 的操作。
CREATE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型
[characteristics ...]
BEGIN
函数体 #函数体中肯定有 RETURN 语句
END
SELECT 函数名(参数列表) ;