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

news2024/9/22 21:31:30

视图(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()
begin
    declare 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))
begin
    if score>=85 then
        set  result:='优秀';
        elseif score>=60 then
            set result:='及格';
            else
                set result:='不及格';

        end if;
end;
call p4(99,@result);
select  @result;


create procedure p5(inout score int)
begin
    set 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)
begin
    declare total int default 0;
    sum:loop
        if n<=0 then
            leave  sum;
        end if;
        if n%2=1 then
            set 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)
begin
    declare 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 do
        fetch 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
begin
    declare sum int  default 0;
    while n>0 do
        set 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_trigger
    after insert on tb_user for each row

begin
        insert 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_trigger
    after update on tb_user for each row

begin
        insert 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_trigger
    before delete on tb_user for each row
begin
              insert 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.coloradmin.cn/o/511015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发编程进阶

并发编程进阶 文章目录 并发编程进阶一、JMM1. JMM的定义&#xff1a;2. 内存屏障&#xff1a; 三. volatile四. as-if-serial五. happens-before六. 缓存一致性&#xff08;Cache coherence&#xff09;7. Synchronized1. synchronized 的使用2. synchronized底层原理 8. Conc…

Web3.0介绍与产业赛道(去中心化,金融与数字资产,应用与存储,区块链技术)

文章目录 1、web3.0时代——区块链技术2、产业赛道&#xff1a;去中心化金融与数字资产3、产业赛道&#xff1a;去中心化应用与存储4、区块链&#xff1a;基础设施与区块链安全和隐私 1、web3.0时代——区块链技术 Web3.0是什么 Web3.0是指下一代互联网技术&#xff0c;它将在…

最优化理论-线性规划的标准形

目录 一、引言 二、线性规划的标准形 1. 线性规划的定义 2. 线性规划的标准形 3. 线性规划的约束条件 三、线性规划的求解方法 1. 单纯形法 2. 内点法 3. 割平面法 四、线性规划的应用 1. 生产计划 2. 运输问题 3. 投资组合问题 五、总结 一、引言 最优化理论是…

数据链路层及其重要协议——以太网

文章目录 数据链路层前言1. 以太网协议2. MTU&#xff08;传输的限制&#xff09;3. ARP协议 数据链路层 前言 以太网&#xff1a; 不是一种具体的网络&#xff0c;而是一种技术标准。既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xff0c;例如&#xf…

网络层——IP协议详细解读

文章目录 IP协议1. IP协议的报文格式2. IP协议的地址管理3. IP地址的组成4. IP协议的路由选择 IP协议 之前介绍了传输层的重点协议&#xff0c;TCP和UDP协议&#xff0c;以下将介绍网络层的重点协议IP协议。 1. IP协议的报文格式 IP地址 本质上是一个32位整数&#xff0c;在…

华为OD机试真题 Java 实现【不爱施肥的小布】【2023Q2】

一、题目描述 某农村主管理了一大片果园&#xff0c;fields[i]表示不同国林的面积&#xff0c;单位m2&#xff0c;现在要为所有的果林施肥且必须在n天之内完成&#xff0c;否则影响收成。小布是国林的工作人员&#xff0c;他每次选择一片果林进行施肥&#xff0c;且一片国林施…

【Linux初阶】环境变量 | 如何设置、获取环境变量?

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;讨论为什么指令作为一个可执行程序不需要加 ./运行&#xff1b;环境变量为什么会自己恢复&#xff1b;环境变量…

Acwing456. 车站分级

一条单向的铁路线上&#xff0c;依次有编号为 1, 2, …, n的 n 个火车站。 每个火车站都有一个级别&#xff0c;最低为 1 级。 现有若干趟车次在这条线路上行驶&#xff0c;每一趟都满足如下要求&#xff1a;如果这趟车次停靠了火车站 xx&#xff0c;则始发站、终点站之间…

【网络】-- 数据链路层

应用层&#xff08;http、https&#xff09;&#xff1a; 数据的使用。传输层&#xff08;UDP、TCP&#xff09;&#xff1a;网络通讯的细节&#xff0c;将数据可靠的从A主机跨网络送到B主机。网络层&#xff08;IP&#xff09;&#xff1a;提供一种能力&#xff0c;将数据从A主…

Real-ESRGAN:Training Real-World Blind Super-Resolution with Pure Synthetic Data

https://github.com/NightmareAI/Real-ESRGAN/tree/masterhttps://github.com/NightmareAI/Real-ESRGAN/tree/master从SRCNN到EDSR&#xff0c;总结深度学习端到端超分辨率方法发展历程 - 知乎超分辨率技术&#xff08;Super-Resolution, SR&#xff09;是指从观测到的低分辨率…

设计模式MVC、MVP、MVVM

MVC、MVP和MVVM是什么&#xff1f; MVC&#xff1a;Model-View-Controller&#xff0c;是一种分层解偶的框架&#xff0c;Model层提供本地数据和网络请求&#xff0c;View层处理视图&#xff0c;Controller处理逻辑&#xff0c;存在问题是Controller层和View层的划分不明显&am…

SpringBoot+@Validate+全局异常拦截实现自定义规则参数校验(校验get请求参数不能为空且在指定枚举类型中)

场景 SpringBootValidated实现参数验证(非空、类型、范围、格式等)-若依前后端导入Excel数据并校验为例&#xff1a; SpringBootValidated实现参数验证(非空、类型、范围、格式等)-若依前后端导入Excel数据并校验为例_validated 怎么设置boolean类型非空_霸道流氓气质的博客-…

Elasticsearch02

目录 Elasticsearch02DSL查询文档查询所有全文检索查询精确查询地理查询复合查询 搜索结果处理排序分页高亮 DSL总结RestClient查询文档快速入门:match_all查询match查询精确查询布尔查询排序、分页高亮 实战案例HotelControllerIHotelServiceHotelMapperHotelHotelDocPageResu…

Google SEO优化的10大误区

以下是 Google SEO 优化的十大误区&#xff1a; 1、关键词堆砌&#xff1a; 过度使用关键词&#xff0c;使得内容不自然&#xff0c;难以阅读&#xff0c;同时也会被搜索引擎认为是垃圾信息&#xff0c;影响网站排名。 2、内容质量差&#xff1a; 质量差的内容会降低用户的体…

矩池云上配置FusionGan环境

1、租赁环境 2、vscode 连接 矩池云 教程&#xff1a;https://www.matpool.com/supports/doc-vscode-connect-matpool/ 3、进入mnt文件夹 cd ../mnt 4、克隆代码 git clone https://github.com/jiayi-ma/FusionGAN.git 如果克隆不下来&#xff0c;就自己下载&#xff0c;…

ESP32 DW1000 UWB 室内定位系统

相关软件代码下载》》 概述 在这个项目中,我们将制作一个基于 ESP32 DW1000 UWB 的室内定位系统。为此,我们将使用 2 个 UWB 锚点和 1 个 UWB 标签。当标签移动时,UWB 标签的实时位置可以使用Python 程序在PC 上以图形方式显示。 工业环境中的室内跟踪通常需要非常精确的…

C++引用的相关定义以及使用场景与指针之前的区别

一、引用的定义与特性 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 引用的特性&#xff1a; 引用在定义时必须初始化一个变量可以有多个引用引用一旦引用…

电脑技巧:宽带怎么设置教程笔记,看完你就会了

宽带的设置是指将计算机连接到互联网的过程。一般来说&#xff0c;宽带的设置是非常简单的&#xff0c;只需要按照提供商的要求&#xff0c;正确地连接硬件和软件就可以了。下面将详细介绍如何设置宽带。 硬件设置&#xff1a;首先&#xff0c;需要连接计算机和调制解调器&…

sharding-jdbc读写分离实战

一、读写分离介绍 Sharding-JDBC读写分离则是根据SQL语义的分析&#xff0c;将读操作和写操作分别路由至主库与从库。它提供透明化读写分离&#xff0c;让使用方尽量像使用一个数据库一样使用主从数据库集群。 为了实现Sharding-JDBC的读写分离&#xff0c;首先&#xff0c;要…

Leetcode2404. 出现最频繁的偶数元素

Every day a Leetcode 题目来源&#xff1a;2404. 出现最频繁的偶数元素 解法1&#xff1a;哈希 我们构建一个这样的哈希表 unordered_map<int, int> umap&#xff1a; key&#xff1a;偶数数组元素 nums[i]value&#xff1a;nums[i]的出现次数 count 我们遍历一次数…