MySQL学习-存储过程(三)-创建与调用存储过程

210 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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的工资。

今天先学习到这里,明天继续。