目录
本章的函数其实相当于用户自定义的函数,前文所学的是内置函数
一、存储过程
1、存储过程概述
1.1 理解
1.2 分类
2、创建存储过程
2.1 语法分析
语法:
说明:
对第五点的举例
由于MySQL中;代表语句的结束,因此需要更改结束的标志符号才不会报错,而第一个DELIMITER 相当于使用$符号来当作结束语句,而不是分号了,这样才不会报错。如果要把结束语句改回来,可以再次使用DELIMITER
3、代码示例
3.1 准备工作
3.2 存储过程的调用
关键字:CALL
CALL select_all_data();
3.3 创建存储过程
类型1:没有参数
举例1:创建存储过程select_all_data(),查看employees表的所有数据 //存储过程的名称相当于函数名字,要放在CREATE PROCEDURE后面。
DELIMITER $
CREATE PROCEDURE select_all_data()
BEGIN
SELECT * FROM employees;
END $
DELIMITER ;
举例2:创建存储过程avg_employyes_salary(),返回所有员工的平均工资
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN
SELECT AVG(salary) FROM employees;
END //
DELIMITER ;
#调用
CALL avg_employee_salary();
类型2:带OUT(有返回值)
举例4:创建存储过程show_min_salary(),查看"emps"表的最低薪资值。并将最低薪资通过OUT参数"ms"输出
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
BEGIN
SELECT MIN(salary) INTO ms FROM employees;
END //
DELIMITER ;
#调用
CALL show_min_salary(@ms);
#查看变量值
SELECT @ms;
类型3:带IN(有参数)
举例5:创建存储过程show_someone_salary(),查看"emps"表的某个员工的薪资,并用IN参数empname输入员工姓名
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN
SELECT salary FROM employees WHERE last_name=empname;
END //
DELIMITER ;
#调用
方式1
CALL show_someone_salary('Abel');
#方式2:
SET @empname:='Abel'; //:=赋值符号
CALL show_someone_salary(@empname);
//查询结果
SELECT * FROM employees WHERE last_name='Abel'
类型4:带IN和OUT
举例6:创建存储过程show_someone_salary2(),查看"emps"表的某个员工的薪资,并用IN参数empname输入员工姓名,用OUT参数empsalary输出员工薪资
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
BEGIN
SELECT salary INTO empsalary FROM employees WHERE last_name=empname;
END //
DELIMITER ;
#调用
SET @empname:='Abel';
CALL show_some salary2(@empname,@empsalary);
SELECT @empsalary;
类型5:带INOUT
举例7:创建存储过程show_mgr_name(),查询某个员工领导的姓名,并且使用INOUT参数"empname"输入员工的姓名,输出领导姓名
DELIMITER $
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN
SELECT manager_id FROM employees WHERE employee_id=(SELECT manager_id FROM employees WHERE last_name=empname);
END $
DELIMITER ;
#调用
SET @empname:='Abel';
CALL show_mgr_name(@empname);
SELECT @empname;