介绍
存储过程(Stored Procedure)是一个小型数据库系统,一组完成特定功能的SQL语句集,它存储在数据库中,一旦编译永久有效,用户指定存储过程的名称并给出参数(如带参数的存储过程)来执行它。 存储过程是数据库中的重要对象。
存储过程的使用 创建存储过程
句型:
CREATE PROCEDURE 存储过程名( IN|OUT|INOUT 参数名 数据类型 , ...)
BEGIN
...
END;
MySQL存储过程的参数类型:
IN,表示存储过程的输入参数,参数的值会传递给存储过程,在存储过程中可以改变参数,存储过程返回时,不会返回参数值,这相当于存储过程中对此参数的更改对调用者不可见。
OUT表示存储过程的输入参数。 该参数的值将在存储过程中被初始化为 NULL。 当存储过程返回时,值也会被返回,调用者可以听到改变后的值。
INOUT代表存储过程的输入输出参数。 参数由调用者初始化。 在存储过程中所做的任何修改都将被返回,调用者可以看到更改后的值。
示例存储过程创建:
创建一个存储过程student_procedure,student_procedure有一个输入参数age和一个输出参数num,查询tb_student表中年龄小于或等于输入参数age的学生人数,将人数设置为num。
CREATE PROCEDURE student_procedure(IN age TINYINT, OUT num INT)
BEGIN
SELECT COUNT(*) INTO num FROM tb_student t WHERE t.age>=age;
END;
MySQL命令行创建存储过程:
如果在MySQL命令行创建存储过程,需要临时更改句式分隔符,因为MySQL默认的句式分隔符是;,会导致直接解析存储过程中的语句辅助论坛,造成句型错误。
-- 设置//为语句分隔符
mysql> DELIMITER //
mysql> CREATE PROCEDURE student_procedure(IN age TINYINT, OUT num INT)
-> BEGIN
-> SELECT COUNT(*) INTO num FROM tb_student t WHERE t.age>=age;
-> END;
-> //
Query OK, 0 rows affected
--恢复为原来的分隔符
mysql> DELIMITER ;
调用存储过程
tb_student 表数据:
+----+------+-----+-------------+-----------+----------+
| id | name | age | phone | address | class_id |
+----+------+-----+-------------+-----------+----------+
| 1 | 小明 | 18 | 188xxxx1234 | xxxxxxxxx | 1 |
| 2 | 小米 | 28 | 188xxxx1234 | xxxxxxxxx | 2 |
| 3 | 小看 | 28 | 188xxxx1234 | xxxxxxxxx | 3 |
| 4 | 小阿 | 38 | 188xxxx1234 | xxxxxxxxx | 3 |
| 5 | 小鬼 | 48 | 188xxxx1234 | xxxxxxxxx | 3 |
+----+------+-----+-------------+-----------+----------+