携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
前言
上篇我们学习了一部分MySQL中的存储过程。有兴趣的小伙伴可以阅读(# MySQL学习-存储过程(二)-创建存储过程)。
下面继续学习MySQL中的存储过程。
学习了创建存储过程的语句以及说明后,下面实际创建一些存储过程。
创建存储过程
举例一
创建存储过程select_all_data(),查看emps表的所有数据。
DELIMITER $
CREATE PROCEDURE select_all_data()
BEGIN
SELECT * FROM emps;
END $
DELIMITER ;
举例二
创建存储过程avg_emp_salary(),返回所有员工的平均工资。
DELIMITER //
CREATE PROCEDURE avg_emp_salary()
BEGIN
SELECT AVG(salary) AS avg_salary
FROM emps;
END //
DELIMITER ;
举例三
创建存储过程show_max_salary(),返回表中最高工资。
DELIMITER //
CREATE PROCEDURE show_max_salary()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '员工最高工资'
BEGIN
SELECT MAX(salary) AS max_salary
FROM emps;
END //
DELIMITER ;
举例四
创建存储过程show_min_salary(),返回表中最低工资。并将最低工资通过OUT参数“minSalary”输出
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT minSalary DOUBLE)
BEGIN
SELECT MIN(salary) INTO minSalary
FROM emps;
END //
DELIMITER ;
举例五
创建存储过程show_salary_by_name(),返回某位员工的工资,并用IN参数empName输入员工姓名。
DELIMITER //
CREATE PROCEDURE show_salary_by_name(IN empName VARCHAR(20))
BEGIN
SELECT salary
FROM emps
WHERE empName = employee_name;
END //
DELIMITER ;
举例六
创建存储过程show_salary_by_name_new(),返回某位员工的工资,并用IN参数empName输入员工姓名,用OUT参数“empSalary”输出。
DELIMITER //
CREATE PROCEDURE show_salary_by_name_new(IN empName VARCHAR(20), OUT empSalary DOUBLE)
BEGIN
SELECT salary INTO empSalary
FROM emps
WHERE empName = employee_name;
END //
DELIMITER ;
举例七
创建存储过程show_mgr_name,返回某个员工领导的姓名,并用INOUT参数“empName”输入员工姓名,输出员工领导姓名。
DELIMITER //
CREATE PROCEDURE show_mgr_name(INOUT empName VARCHAR(20))
BEGIN
SELECT salary INTO empName
FROM emps
WHERE employee_id = (
SELECT manager_id
FROM emps
WHERE empName = employee_name
);
END //
DELIMITER ;
上面几个例子,学习了如何编写存储过程,下面学习怎么调用这些存储过程。
调用存储过程
调用格式
存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库有关,如果要执行其他数据库中的存储过程,需要指定数据库名称,例如CALL dbname.procname。
CALL 存储过程(实参列表)
格式:
- 调用IN模式的参数
CALL proname('参数值');
- 调用OUT模式的参数
SET @name;
CALL proname(@name);
SELECT @name;
- 调用INOUT模式的参数
SET @name = 值;
CALL proname(@name);
SELECT @name;
举例八
调用上面的举例六中的存储过程show_salary_by_name_new()。
CALL show_salary_by_name_new("xiaoming", @empSalary);
SELECT @empSalary;
可以查出xiaoming的工资。
今天先学习到这里,明天继续。