Mysql 存储过程 / 存储函数
目录
0 课程视频
1 基本语法
1.0 作用 ->在数据库中 封装sql语句 -> 复用 -> 减少网络交互 ->可接收参数返回数据
1.1 创建
1.2 调用
1.3 查看
1.4 删除
1.5 ; 封号结束符 改成 $$ 双刀符合结束语句 -> 因为打包封号结束有冲突
1.6 在cmd 中定义 存储过程 打包的事务 -> 打包完 可以改回 封号
3.1 @@指系统变量
3.1.1 全局变量 global
3.1.2 会话变量 session
3.1.3 查看系统变量
3.1.4 设置系统变量
3.1.5 设置global重启后回复初始值 -> 修改MySQL配置文件 /etc/my.cnf
3.2 @指 用户自定义变量 ->作用域当前连接 会话
3.2.1 赋值
3.2.2 使用 -> 不用声明 -> 不存在返回null
3.3 局部变量
3.3.1 声明
3.3.2 示例 -> 作用域 begin end 范围之间
4 参数 -> 方法传参 -> 方法返回值
4.1 类型 in / out / inout
4.2 用法
4.2.1 定义->示例演示 -> 打包的存储过程可以传参 可以返回值
4.2.2 调用 定义的方法 -> IN 参数 OUT 参数是定义局部变量@xxx 接收返回值
4.2.3 查看返回值 select @xxx
4.2.4 既是传入类型又是输出类型 inout -> 示例演示
5 判读
5.1 if ... then ...->示例演示 局部变量 -> 打包储存过程
5.2 case
5.2.1 语法一
5.2.2 语法二 -> 示例演示
5.3 while 循环 ->满足条件 ->循环
5.3.1 示例演示 -> 先储存 p7 -> 再call p7
5.4 repeat 循环 -> 满足条件 -> 退出循环
5.4.1 示例演示
5.5 loop
5.5.1 loop 简单循环 -> 死循环
5.5.2 leave -> 退出循环 否则loop是死循环 -> 示例演示
5.5.3 iterate -> 必须再循环中 -> 跳过当前循环 执行下一次循环 ->示例演示
6 游标cursor -> 接收 打包的存储过程返回的结果集 / 表
6.1 基本语法
6.1.1 申明 declare xxx cursor for 查询语句
6.1.2 打开游标 open xxx ;
6.1.3 获取游标记录 -> 循环遍历 结果集 ->fetch xxx into 新定义的局部变量 yy ;
6.1.4 关闭游标 close xxx;
6.2 逻辑分析
6.2.1 声明游标 -> 查询 -> 记录结果集
6.2.2 建表 -> 接收数据
6.2.3 while 循环 -> 获取数据 游标fetch-> 定义新局部变量接收值(while外面定义)
6.2.4 while中 新表 插入数据 insert into 新表 values(null , 新局部变量, 新局部变量2)
6.3 示例展示 ->局部变量要声明在游标之前
7 条件处理程序 -> 异常处理
7.1 语法
7.2 示例演示 -> 报错状态码
7.3 官方异常状态码含义查询网站
7.4 优化写法 declare exit handler for not found close 游标名 ;
8 存储函数(用的少) -> 定义方法/函数
8.0 特殊的存储过程 -> 必须有返回值 -> 只能是IN 类型
8.1 示例演示 必须指定 deterministic / no sql / reads sql data 三选一
8.2 调用函数 select fun1(100); fun1是函数名
0 课程视频
https://www.bilibili.com/video/BV1Kr4y1i7ru?p=102&spm_id_from=pageDriver&vd_source=ff8b7f852278821525f11666b36f180a
1 基本语法
1.0 作用 ->在数据库中 封装sql语句 -> 复用 -> 减少网络交互 ->可接收参数返回数据
1.1 创建
create procedure p1()
begin
select count(*) from student;
end;
1.2 调用
call p1();
1.3 查看
-- 第一种 数据库有哪些 存储过程 ->打包的操作事务
select * from infromation_schema.Routines where routine_schema = '数据库名' ;
-- 第二种 储存过程 ->打包的操作事务 具体的语句
show create procedure p1;
1.4 删除
drop procedure if exists p1 ;
1.5 ; 封号结束符 改成 $$ 双刀符合结束语句 -> 因为打包封号结束有冲突
delimiter $$ // 此句无封号 ;
1.6 在cmd 中定义 存储过程 打包的事务 -> 打包完 可以改回 封号
2 navacat 中 mysql 文件结构树3 变量
3.1 @@指系统变量
3.1.1 全局变量 global
3.1.2 会话变量 session
3.1.3 查看系统变量
show variables; // 查看所有 默认session 会话级别变量
show session variables like 'atuo%' ; // 后模糊匹配 atuo
show global variables like 'atuo%' ;
select @@autocommit ; // 查看具体变量的值 autocommit是具体系统变量 默认session
select @@global.autocommit ;
3.1.4 设置系统变量
set session autocommit = 0 ; // autocommit 是具体的变量 自动提交事务关闭
3.1.5 设置global重启后回复初始值 -> 修改MySQL配置文件 /etc/my.cnf
3.2 @指 用户自定义变量 ->作用域当前连接 会话
3.2.1 赋值
-- 赋值 可以是 = 也可以是 :=
-- 推荐使用 := 因为MySQL 没有比较运算符 比较运算符用的是=
set @myname = 'xxx' ;
set @myage := 18 ;
-- 一次赋值多个
set @myage := 'xxx',@myname = 'xxx';
-- 查询结果赋值给变量
select count(*) into @mycount from user ;
3.2.2 使用 -> 不用声明 -> 不存在返回null
select @myname , @myage ;
3.3 局部变量
3.3.1 声明
declare xxx int default 0 ;
3.3.2 示例 -> 作用域 begin end 范围之间
create procedure p2()
begin
declare xxx int default 0; // 申明局部变量
select count(*) from student ; // 封号是因为这里不是用cmd终端 ,用的是idea数据库终端
end;
4 参数 -> 方法传参 -> 方法返回值
4.1 类型 in / out / inout
4.2 用法
4.2.1 定义->示例演示 -> 打包的存储过程可以传参 可以返回值
4.2.2 调用 定义的方法 -> IN 参数 OUT 参数是定义局部变量@xxx 接收返回值
call p4(68, @result); // IN 参数68 OUT 参数 定义局部变量@result
4.2.3 查看返回值 select @xxx
select @xxx ;
4.2.4 既是传入类型又是输出类型 inout -> 示例演示
5 判读
5.1 if ... then ...->示例演示 局部变量 -> 打包储存过程
5.2 case
5.2.1 语法一
5.2.2 语法二 -> 示例演示
5.3 while 循环 ->满足条件 ->循环
5.3.1 示例演示 -> 先储存 p7 -> 再call p7
5.4 repeat 循环 -> 满足条件 -> 退出循环
5.4.1 示例演示
5.5 loop
5.5.1 loop 简单循环 -> 死循环
5.5.2 leave -> 退出循环 否则loop是死循环 -> 示例演示
5.5.3 iterate -> 必须再循环中 -> 跳过当前循环 执行下一次循环 ->示例演示
6 游标cursor -> 接收 打包的存储过程返回的结果集 / 表
6.1 基本语法
6.1.1 申明 declare xxx cursor for 查询语句
declare xxx cursor for 查询语句->是个表 结果集 ;
declare xxx cursor for select ... from ... where ... ;
6.1.2 打开游标 open xxx ;
open xxx ;
6.1.3 获取游标记录 -> 循环遍历 结果集 ->fetch xxx into 新定义的局部变量 yy ;
declare yy varchar(10);
fetch xxx into 新定义的局部变量 yy ;
6.1.4 关闭游标 close xxx;
6.2 逻辑分析
6.2.1 声明游标 -> 查询 -> 记录结果集
6.2.2 建表 -> 接收数据
6.2.3 while 循环 -> 获取数据 游标fetch-> 定义新局部变量接收值(while外面定义)
6.2.4 while中 新表 插入数据 insert into 新表 values(null , 新局部变量, 新局部变量2)
6.3 示例展示 ->局部变量要声明在游标之前
ps: 代码两个bug 1.死循环->解决办法 条件处理程序 2.局部变量定义需要在游标定义之前
7 条件处理程序 -> 异常处理
7.1 语法
7.2 示例演示 -> 报错状态码
7.3 官方异常状态码含义查询网站
http://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html
7.4 优化写法 declare exit handler for not found close 游标名 ;
8 存储函数(用的少) -> 定义方法/函数
8.0 特殊的存储过程 -> 必须有返回值 -> 只能是IN 类型
8.1 示例演示 必须指定 deterministic / no sql / reads sql data 三选一