数据库的存储过程、触发器、事件 实现(超精简)

news2024/9/25 23:12:37

一 存储过程

什么是存储过程 : 自己搜
和代码写的有什么区别: 没区别
为什么用存储过程: 快

例子

-- 创建 test名字的存储过程
CREATE PROCEDURE `test`(in idin INT)
BEGIN
	-- 创建变量
	declare id int default 0;
	declare stopflag int default 0;
	declare username varchar(31) default '';
	-- 创建游标
	declare item cursor for select u.router_id id, u.`name` username from base_router u where u.router_status = idin;
	-- 出现异常时执行功能(可做循环结束判断)
	declare continue handler for not found set stopflag = 1;
	-- 打开游标
	OPEN item;
	-- 创建一个名字为 loop_lable 的loop循环
	loop_lable: LOOP
	-- 将游标的一行注入变量里
	fetch item into id, username;
	-- if判断是否结束
	IF stopflag = 1 THEN
	-- 结束 循环结束
		LEAVE loop_lable; 
	END IF;
	-- 业务逻辑处理
	BEGIN
	IF id = 5 THEN
		UPDATE base_router r SET r.create_user = '10001' WHERE r.router_id = id;
	ELSE
		UPDATE base_router r SET r.update_user = '10001' WHERE r.router_id = id;
	END IF;
	END;
	-- loop 结束语句
	END LOOP loop_lable;
	-- 执行完成关闭游标
	close item;
END

解析:

1. 创建存储过程:procedure

create procedure procedure_name(in itemIn int, inout itemOut int, out itemOut int)
begin
...
end;
-- in 传递参数
-- out 输出参数
-- inout 传递参数并输出
-- procedure_name 存储过程名称

2. 调用存储过程 : call

 call name();
 -- 传递参数
 set @item = ''
 call name(@item);
 select @item 

3. 变量: declare

begin
	--  创建参数,并指定参数类型,默认值
	declare item varchar(31) default '';
	-- 使用 set 赋值
	set item = 'bianlaing';
	-- 使用 into 赋值
	select name into item from user where 1 = 1;
end;

4. 变量的作用于只在begin - end 之间,begin - end 可以有多层,可设置全局变量

begin
	declare item varchar(31) default '';
	begin
	...
	end
end

5. 条件语句

-- if格式: 
	if boolean then
	...
	elseif boolean then
	...
	else 
	...
	end if;
-- case格式:
	case item
	when boolean then ...
	when boolean then ...
	else ...
	end case;

6. 循环

-- while 循环
while(boolean) do
...
end while;
-- repeat  循环
repeat 
	begin
	...
	end;
-- 达成条件结束 为true时结束,与while条件相反
until boolean
end repeat;
-- loop循环
loop_name: loop 
	if boolean then 
		leave loop_name;
	else
		...
	end if;
	...
end loop loop_name;

7. 游标 : cursor

代表结果集,可对结果集进行循环

-- 创建 test名字的存储过程
CREATE PROCEDURE `test`(in idin INT)
BEGIN
	-- 创建变量
	declare id int default 0;
	declare stopflag int default 0;
	declare username varchar(31) default '';
	-- 创建游标
	declare item cursor for select u.router_id id, u.`name` username from base_router u where u.router_status = idin;
	-- 游标出现异常时执行功能(可做循环结束判断)
	declare continue handler for not found set stopflag = 1;
	-- 打开游标
	OPEN item;
	-- 创建一个名字为 loop_lable 的loop循环
	loop_lable: LOOP
	-- 将游标的一行注入变量里
	fetch item into id, username;
	-- if判断是否结束
	IF stopflag = 1 THEN
	-- 结束 循环结束
		LEAVE loop_lable; 
	END IF;
	-- 业务逻辑处理
	BEGIN
	...
	END;
	-- loop 结束语句
	END LOOP loop_lable;
	-- 执行完成关闭游标
	close item;
END

在这里插入图片描述
在这里插入图片描述

二 触发器

关键词:TRIGGER

-- 触发器共有三种:insert,update,delete
-- 触发事件有两种:after, before
-- 触发器的参数只有两种: new,old   insert 只能用new delete 只能用old updata 修改前的用old,修改后的用new
-- 触发器查看: show TRIGGERS; 或者选择 on 后边的主表,可以查看触发器(navicat),plsql可以直接看trigger
CREATE TRIGGER test_updata AFTER INSERT ON test1
	FOR EACH ROW
	BEGIN
	 INSERT INTO test2(id,name,status) VALUES (new.id, new.name,new.status);
	END;

关于触发器在哪看

  1. show TRIGGERS
    在这里插入图片描述
  2. AFTER INSERT ON test1 的表里
    在这里插入图片描述
    在这里插入图片描述

三 事件

就是定时任务
关键词 event

规则

CREATE Event [IF NOT EXISTS] event_name -- 创建使用create event
ON SCHEDULE schedule_time
 -- on schedule 什么时候来执行,执行频率
-- on schedule at '2023-02-01 04:00:00’ 指定时间
-- on schedule every 1 second 每秒执行一次
-- 也可以是 minute、hour、day、week、month、year
-- on schedule every 1 day starts ‘2023-02-01 04:00:00' 指定每次的指定时间
[ON COMPLETION [NOT] PRESERVE] -- 调度计划执行完成后是否还保留
[ENABLE | DISABLE] -- 是否生效事件
[COMMENT 'comment'] -- 事件的注释
DO event_body; -- 这个调度计划要做什么?

例子

CREATE EVENT `test_event` 
ON SCHEDULE AT '2023-08-09 11:45:00' 
ON COMPLETION PRESERVE
ENABLE
DO INSERT INTO test1(id,name,status) VALUES (3, '张三','1');

事件在哪

  1. show events;

在这里插入图片描述
2. navcat
在这里插入图片描述
写在最后:
在理论上,数据库的存储过程、触发器、事件 都可以用代码替代,就是一串逻辑、定时任务等。但为啥推荐使用数据库上的功能呢?
1. 可读性 – 比看代码掉的头发少
2. 速度快 – 全在库内执行,不需要先取出来 再添加逻辑,再插入 ,减少数据库访问
3. 减少网络延迟 – 一般情况下数据库和程序不在同一个服务器上,还要访问

4. 体现你的价值 --薅着你老板仅剩不多的头发,让他涨工资

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854022.html

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

相关文章

爬虫015_python异常_页面结构介绍_爬虫概念介绍---python工作笔记034

来看python中的异常 可以看到不做异常处理因为没有这个文件所以报错了 来看一下异常的写法

【C++】C++回调函数基本用法(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【Flutter】【packages】simple_animations 简单的实现动画

package:simple_animations 导入包到项目中去 可以实现简单的动画, 快速实现,不需要自己过多的设置 有多种样式可以实现[ ] 功能: 简单的用例:具体需要详细可以去 pub 链接地址 1. PlayAnimationBuilder PlayAnima…

winform控件 datagridview分页功能

主要实现页面跳转、动态改变每页显示行数、返回首末页、上下页功能,效果图如下: 主代码如下: namespace Paging {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int currentPageCount;//记录当前页行数…

ApplicationContext在Spring Boot中是如何创建的?

一、ApplicationContext在Spring Boot中是如何创建的? 1. SpringApplication ApplicationContextFactory有三个实现类,分别是AnnotationConfigReactiveWebServerApplicationContext.Factory、AnnotationConfigServletWebServerApplicationContext.Facto…

nginx动态加载配置文件的方法

1. main函数调用ngx_get_options函数 2. ngx_get_options(int argc, char *const *argv)中会解析用户输入命令。 case ‘s’: if (*p) { ngx_signal (char *) p; } else if (argv[i]) {ngx_signal argv[i];} else {ngx_log_stderr(0, "option \"-s\" requi…

将数组按照某个对象分类,结果值的json的值按照value递增排序

const arr [ { value: 532, lable: 1, type: “a” }, { value: 132, lable: 24, type: “b” }, { value: 432, lable: 13, type: “b” }, { value: 1812, lable: 5, type: “b” }, { value: 1932, lable: 8, type: “c” }, { value: 132, lable: 4, type: “a” }, { val…

CNN经典网络模型之GoogleNet论文解读

目录 1. GoogleNet 1.1 Inception模块 1.1.1 1x1卷积 1.2 辅助分类器结构 1.3 GoogleNet网络结构图 1. GoogleNet GoogleNet,也被称为Inception-v1,是由Google团队在2014年提出的一种深度卷积神经网络架构,专门用于图像分类和特征提取任…

一个竖杠在python中代表什么,python中一竖代表什么

大家好,小编来为大家解答以下问题,一个竖杠在python中代表什么,python中一竖代表什么,今天让我们一起来看看吧! 维基百科页面是错误的,我已经更正了。|和&不是布尔运算符,即使它们是急切运算…

Intune 应用程序管理

由于云服务提供了增强的安全性、稳定性和灵活性,越来越多的组织正在采用基于云的解决方案来满足他们的需求。这正是提出Microsoft Endpoint Manager等解决方案的原因,它结合了SCCM和Microsoft Intune,以满足本地和基于云的端点管理。 与 Int…

uni——月份选择(横向滑动tab,横向滚动选择日期)

案例展示 案例代码 已封装成组件使用 <template><view><view class"tabBox"><scroll-view scroll-x"true" :scroll-left"scrollLeft" :scroll-with-animation"true"><view class"box"><…

AtcoderABC313场

A - To Be SaikyoA - To Be Saikyo 题目大意 有N个人&#xff0c;编号从1到N。每个人有一个整数分数&#xff0c;称为编程能力&#xff1b;第i个人的编程能力是Pi分。人1需要多少分才能成为最强者&#xff1f;换句话说&#xff0c;最小非负整数x是多少&#xff0c;使得对于所有…

10万SUV大魔王?市场再添新成员,北汽新魔方正式上市,鸿蒙加持

根据报道&#xff0c;北京汽车宣布新一款名为新魔方的车型已经在位于北京汽车株洲基地的超级工厂开始大规模生产。这款车型是继北京新EU5 PLUS之后的又一重要产品&#xff0c;被认为将对10万级SUV市场带来颠覆性影响。 据报道&#xff0c;北汽魔方是首款搭载鸿蒙HarmonyOS智能操…

【UE4 RTS】05-Fixing Camera Movement

前言 本篇实现了两个功能&#xff1a;一是解决CameraPawn旋转后&#xff0c;前进方向没变的问题&#xff1b;二是玩家可选择提高CameraPawn的移动速度 效果 一、解决CameraPawn旋转后&#xff0c;前进方向没变的问题 二、玩家可提高CameraPawn移动速度 步骤 一、解决Camera…

IDEA离线安装插件

一、背景 有时&#xff0c;在ideal中我们无法获取到插件&#xff0c;可能是因为内网或者无法访问插件库等原因&#xff0c;此时我们需要离线安装插件 IDEA离线仓库&#xff1a;https://plugins.jetbrains.com/ 二、步骤 2.1 下载插件&#xff1a;https://plugins.jetbrains.…

20230809在WIN10下使用python3处理Google翻译获取的SRT格式字幕(DOCX)

20230809在WIN10下使用python3处理Google翻译获取的SRT格式字幕&#xff08;DOCX&#xff09; 2023/8/9 19:02 由于喜欢看纪录片等外文视频&#xff0c;通过剪映/PR2023/AUTOSUB识别字幕之后&#xff0c;可以通过google翻译识别为简体中文的DOCX文档。 DOCX文档转换为TXT文档之…

收藏!新增6省!2023年度杰青、优青名单汇总(附下载)

2023省级自然科学基金项目名单 杰青、优青项目是国家及各省市为促进青年科学和技术人才的成长&#xff0c;加速培养造就一批进入世界科技前沿的优秀学术带头人而特别设立的科学基金&#xff0c;是各个科研单位竞相争夺的青年科技人才。 按照惯例&#xff0c;2023年国家自然基…

百度资深PMO阚洁受邀为第十二届中国PMO大会演讲嘉宾

百度在线网络技术&#xff08;北京&#xff09;有限公司资深PMO阚洁女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;运筹于股掌之间&#xff0c;决胜于千里之外 —— 360斡旋项目干系人。大会将于8月12-13日在北京举办&#xff0c;…

Java基础(八)二维数组

数组 二、二维数组 1. 二维数组使用步骤 定义二维数组 格式&#xff1a;数据类型 数组名[][]; 或 数据类型[][] 数组名; int scores[][]; int[][] scores;为二维数组元素分配内存 格式&#xff1a;数据类型 数组名[][]; 或 数据类型[][] 数组名; int scores[][]; scores …

MinGW-w64的安装详细步骤(c/c++的编译器gcc、g++的windows版,win10、win11真实可用)

文章目录 1、MinGW的定义2、MinGW的主要组件3、MinGW-w64下载与安装3.1、下载解压安装地址3.2、MinGW-w64环境变量的设置 4、验证MinGW是否安装成功5、编写一段简单的代码验证下6、总结 1、MinGW的定义 MinGW&#xff08;Minimalist GNU for Windows&#xff09; 是一个用于 W…