mysql 5.0 以后版本才开始支持存储过程
存储过程:是一种在数据库中存储的复杂的程序,以便外部程序或者其他应用程序对数据进行调用的数据库对象。
两个要点:存储在数据库中 复杂的程序
被调用
简单的来说:存储过程就是在数据库中编写代码,目的是为了完成特定的任务或者功能的 SQL 的集合,它是一个
语句集,经过编辑保存到数据库中,可以让指定的用户对其进行调用,提升效率。
即:是数据库中 SQL 层面的代码的封装和调用。
优点:
1、可封装,并且隐藏复杂的商业逻辑
2、可以进行回传值,并且可以接收参数
3、可以让复杂的语句封装成简单的函数或者子程序
4、可以用在数据校验,企业规则,内部逻辑比较复杂的业务上
缺点:
1、存储过程对数据库的依赖很大,定制化在特定的数据库上,支持的语言规范不一样
2、可移植性一般,复用率低
3、无法直接使用 SELECT 指令进行运行,因为是子程序
--------------------------------------------------------------------------
创建存储过程的语法:
CREATE PROCEDURE 过程名([IN OUT INOUT] 参数名 数据类型,[IN OUT INOUT] 参数名 数据类型,...)
BEGIN
过程体;
END;
----------------------------
# 存储过程的参数
mysql 中参数的定义,一共支持三种类型: IN OUT INOUT
IN 输入参数:表示调用者向过程传入值(可以是具体的值,也可以是变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值,传出的值只能是变量);
INOUT 输入输出参数:表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。
建议: 输入值就用 IN 参数
输出值使用 OUT 参数
INOUT 参数尽量少用
注意:存储过程支持没有参数,即使没有参数,但是过程名后面的()必须要有,不可以省略;
参数的名字不能等于列名,否则的话在执行过程体的时候,参会会被当做整个列来出来。
# 过程体
由合法的 SQL 语句构成,即 SQL 命令集,可执行,过程体包含了过程调用执行的所有的 SQL 语句:
例如: DQL 、DML 、DDL 、IF-THEN-ELSE 等等,以及申明变量。
过程体的格式: 以 BEGIN 开始,以 END 结束(可以嵌套)
注意:每个嵌套块中每条命令结束,都必须使用 ; 结束。
# 调用
1)可以使用一个 CALL 命令通过名字对存储进行调用;
CALL 存储过程的名称();
2) 可以供外部程序调用,比如 Java 程序,比如 python 。
---------------------------- 存储过程实例 -----------------------------------
# 实例:不带参数的存储过程
CREATE PROCEDURE p1()
BEGIN
SELECT 'hello world!' ;
END;