Mysql 存储过程+触发器+存储函数+游标

news/2025/2/21 18:46:59/

视图(view)

虚拟存在的表,不保存查询结构,只保存查询的sql逻辑

语法

存储过程

实现定义并存储在数据库的一段sql语句的集合,可减少网络交互,提高性能,代码复用,内容包括:变量,if,case,参数(in/out/inout),循环(while,repeat,loop),游标和handler

存储过程-基本语法

create和call

create procedure p1()
begin select  count(*) from course;
end;
#调用
call p1();

存储过程-系统变量

#系统变量
show  session  variables ; #查看所有系统变量
show session variables like 'auto%';(等价于 show global variables like 'auto%';)
select  @@session.autocommit;#查看指定系统变量
set session autocommit=0;#设置系统变量,关闭自动提交

存储过程-局部变量

局部变量是存在于存储过程中的,通过declare声明局部变量,同时可以在存储过程中给局部变量赋值

#局部变量
create procedure p2()
begindeclare stu_count int default 0;#说明select count(*) into  stu_count from student;#赋值select stu_count;#查询
end;
call p2();

存储过程-用户自定义变量

定义用户变量用@

#用户变量
#赋值方式一:推荐使用:=
set @myname='itcast';
set @myage:=10;
set @mygender:='男',@myhobby:='java';
#赋值方式二:通过select
select  @mycolor:='red';
select  count(*) into @mycount from student;
#查看
select @myage,@myname;

存储过程-参数(in,out,inout)

#存储过程参数 in:该类参数作为输入,也就是需要调用时传入值
#          out:该类参数作为输出,也就是该参数可以作为返回值
#          inout:既可以作为输入参数,也可以作为输出参数
#存储过程参数 in:该类参数作为输入,也就是需要调用时传入值
#          out:该类参数作为输出,也就是该参数可以作为返回值
#          inout:既可以作为输入参数,也可以作为输出参数create procedure p4(in score int,out result varchar(10))
beginif score>=85 thenset  result:='优秀';elseif score>=60 thenset result:='及格';elseset result:='不及格';end if;
end;
call p4(99,@result);
select  @result;create procedure p5(inout score int)
beginset score:=score*0.5;
end;
#注意点:out和inout需要传的是变量,不能直接传值!!
set  @score=200;
call p5(@score);
select  @score;

存储过程-case

存储过程-while循环

存储过程-repeat循环

存储过程-loop循环

loop循环和leave,iterate关键字配合使用,leave终止循环(相当于break),iterate结束本次循环(相当于continue)

下面例子 计算的是从1加到10的偶数的和

/*
loop循环leave:配合循环使用,退出循环iterate:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次
*/
create  procedure  p10(in n int)
begindeclare total int default 0;sum:loopif n<=0 thenleave  sum;end if;if n%2=1 thenset n:=n-1;iterate sum;end if;set total:=total+n;set n:=n-1;end loop sum;select total;
end;
call p10(10)

游标和handler

游标的声明,打开,获取,关闭。游标类似二维数组,又不太像,因为游标获取一条记录就同时向新表插入一条记录。游标声明:从基本表中获取哪些字段数据,游标获取:将游标从基本表中获取的每一组字段插入到新表中

游标语法:

handler类似异常处理,在下面例子中作用是当while循环游标fetch不到下一组数据,反映给handler退出程序。

handler语法:

 代码练习

create procedure p1(in uage int)
begindeclare uname varchar(100);declare ujob varchar(100);#注意游标要在变量之后声明declare u_cursor cursor for  select  name,job from emp where age<=uage;#handler,处理异常# declare exit handler for not found close u_cursor;drop  table if exists tb_user_pro;create table tb_user_pro(id int primary key auto_increment,name varchar(100),professsion varchar(100));#打开游标open u_cursor;while true dofetch u_cursor into uname,ujob;#通过游标获取数据insert into tb_user_pro values (null,uname,ujob);end while;#关闭游标close u_cursor;
end;
drop  procedure p1;
call p1(30);

存储函数

存储函数是由返回值的存储过程,存储函数的参数只能是in类型

存储函数语法:

 代码:

create function f1(n int)returns int deterministic
begindeclare sum int  default 0;while n>0 doset sum:=sum+n;set n:=n-1;end while;return sum;
end;select  f1(100);

触发器

触发器是和表相关的数据库对象,指的是在对表进行增删改查操作前后触发并执行触发器中定义的sql语句,触发器能保证数据的完整性,分为insert触发器,delete触发器,update触发器

触发器语法

 插入触发器

问题:我们要向表tb_user插入数据,希望在日志表中看到插入后的新记录是什么

 解决:每向表tb_user插入一次,就执行一次insert触发器中的sql语句

代码

create table user_logs(id int(11) not null auto_increment primary key,operation varchar(20) not null  comment '操作类型,增/删/改',operation_time datetime not null comment '操作时间',operation_id int(11) not null comment '操作的id',operation_params varchar(500) comment '操作参数')engine =innodb default charset utf8;-- 插入数据触发器
create trigger tb_user_insert_triggerafter insert on tb_user for each rowbegininsert into user_logs(id, operation, operation_time, operation_id, operation_params)VALUES(null,'insert',now(),new.id,concat('插入的内容为:id=',new.id,',name=',NEW.name,',age=',NEW.age));
end;
show triggers ;
insert into tb_user(id, name, age) VALUES (null,'小何',54);

 修改触发器


-- 修改数据触发器
-- 要在日志表中展示修改前后的数据
create trigger tb_user_update_triggerafter update on tb_user for each rowbegininsert into user_logs(id, operation, operation_time, operation_id, operation_params)VALUES(null,'update',now(),new.id,concat('更新前的内容为:id=',OLD.id,',name=',OLD.name,',age=',OLD.age,'更新后的内容为:id=',new.id,',name=',NEW.name,',age=',NEW.age));
end;
show triggers ;update tb_user set name='小林' where id=4;

 删除触发器

create trigger tb_user_delete_triggerbefore delete on tb_user for each row
begininsert into user_logs(id, operation, operation_time, operation_id, operation_params)VALUES(null,'delete',now(),OLD.id,concat('删除前的内容为:id=',OLD.id,',name=',OLD.name,',age=',OLD.age));
end;show triggers ;
delete from  first.tb_user where id=4;


http://www.ppmy.cn/news/66954.html

相关文章

Ubuntu常用终端操作

终端快捷键 打开 Ctrlaltt:打开终端&#xff08;默认路径为家目录&#xff09; Ctrlshiftn&#xff1a;打开终端&#xff08;与当前终端处于同一路径下&#xff09; Ctrlshiftt:打开终端&#xff08;在大终端下面创建小终端&#xff09; alt数字 关闭 exitCtrld 窗口切换 …

CMAKE介绍和使用

CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下&#xff1a; 写 CMake 配置文件 CMakeLists.txt 。执行命令 cmake PATH 或者 ccmake PA…

Linux知识点 -- 常见指令及权限理解

Linux知识点 – 常见指令及权限理解 文章目录 Linux知识点 -- 常见指令及权限理解一、Linux下基本指令1.ls指令 - 列文件或目录信息2.pwd命令 - 显示用户当前所在目录3.cd指令 - 改变工作目录4.touch指令 - 更改文件时间或新建文件5.mkdir指令 - 创建目录 / tree - 以树状形式显…

非法捕捞识别预警系统 yolov7

非法捕捞识别预警系统通过yolov7网络模型AI视频分析技术&#xff0c;非法捕捞识别预警系统模型算法能够对河道湖泊画面场景中出现的非法捕捞行为进行7*24小时不间断智能检测识别实时告警通知相关人员及时处理。Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测&#xff…

Android 中你碰不到但是很重要的类之ActivityThread

作者&#xff1a;Drummor 通过本文能了解一下内容 1、和系统进程打交道的桥头堡 应用进程起来之后ART(Android Runtime)第一站就是ActivityThread&#xff0c;代码层面上就是ActivityThread的main()方法&#xff0c;是不是很熟悉&#xff0c;爷青回啊&#xff0c;这不就是java…

【Linux】基本权限

&#x1f601;作者&#xff1a;日出等日落 &#x1f514;专栏&#xff1a;Linux 任何值得到达的地方&#xff0c;都没有捷径。 目录 Linux权限: 权限的概念&#xff1a; Linux上面的用户分类&#xff1a; Linux权限管理 文件访问者的分类&#xff08;人&#xff09; 文件…

(一)ArcGIS空间数据的转换与处理——投影变换

ArcGIS空间数据的转换与处理——投影变换 原始数据往往由于在数据结构、数据组织、数据表达等方面与用户需求不一致而要进行转换与处理。本节主要介绍 ArGIS 中数据的投影变换内容。 目录 ArcGIS空间数据的转换与处理——投影变换 1.概述2.定义投影3.投影变换3.1栅格数据的投…

【2023华为OD笔试必会25题--C语言版】《12 光伏场地建设规划》——数组、动态规划

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…