存储过程(存过)
mysql 5.0 以后版本才开始支持存储过程
存储过程:是一种在数据库中存储的复杂的程序,以便外部程序或者其他应用程序对数据进行调用的数据库对象。
两个要点:存储在数据库中 复杂的程序
被调用
简单的来说:存储过程就是在数据库中编写代码,目的是为了完成特定的任务或者功能的 SQL 的集合,它是一个
语句集,经过编辑保存到数据库中,可以让指定的用户对其进行调用,提升效率。
即:是数据库中 SQL 层面的代码的封装和调用。
优点:
1、可封装,并且隐藏复杂的商业逻辑
2、可以进行回传值,并且可以接收参数
3、可以让复杂的语句封装成简单的函数或者子程序
4、可以用在数据校验,企业规则,内部逻辑比较复杂的业务上
缺点:
1、存储过程对数据库的依赖很大,定制化在特定的数据库上,支持的语言规范不一样
2、可移植性一般,复用率低
3、无法直接使用 SELECT 指令进行运行,因为是子程序
创建存储过程的语法:
CREATE PROCEDURE 过程名([IN OUT INOUT] 参数名 数据类型,[IN OUT INOUT] 参数名 数据类型,...)
BEGIN
存储过程的参数
mysql 中参数的定义,一共支持三种类型: 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;
错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near '' at line 3
报错的原因,是语句命令没有正确结束,是因为 ; 界定符造成的,解决办法,修改界定符
# 修改界定符 ; 为 // 或者 $$ , 目的是让 ; 暂时失效,不表示语句结束
修改界定符 delimiter
DELIMITER //
CREATE PROCEDURE p1()
BEGIN
SELECT 'hello world!' ;
END;
//
调用
CALL p1; -- 每调用一次存储过程,就相当于把过程体执行一次
CALL p1(); -- 调用的时候,没有参数的存储过程,()可以加,也可以不加