SQL编程中(触发器、存储过程与函数、游标的使用)

目录

前言:

一、触发器

1.1 触发器简介

1.2 触发器的创建

1.3 示例演示

二、存储过程

2.1 什么是存储过程

2.2 优势与应用场景

2.3 存储过程的创建与使用

各参数类型所实现的存储过程

三、存储函数

3.1 什么是存储函数

3.2 存储函数的创建与使用

调用存储函数

删除存储函数

3.3 实例演示

四、游标

4.1 如何使用游标

1、声明游标

2、声明游标后,想从游标中提取数据,必须要打开游标

3、使用游标

4,关闭游标

4.2 游标的应用


前言:

        在本文中,你将了解并学习到SQL编程中的触发器、存储过程与存储函数的创建与使用,游标的声明与应用,并对SQL中的这些工具有一个宏观上的概念。

一、触发器

1.1 触发器简介

触发器是一种比较特殊的存储过程,它的执行不是由程序调用,也不是手工调用,而是通过事件来进行触发,比如说 对一张表 进行(增,删,改),去激活它的执行。

触发器经常应用在加强数据完整性,和业务规则中,如:当一个学生表中添加了一个学生信息时,那么对应的学生数目肯定会有所改变。像这样的情况,我们就可以针对学生表创建一个触发器:以确保每次增加一个学生记录时,就执行一次关于学生总数的计算操作,从而确保学生总数与记录数的一致性。

1.2 触发器的创建

#语法要求
CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件ON 表名 FOR EACH ROWBEGIN触发器程序体;END	#说明
<触发器名称> 参考索引命名||表命名
BEFORE|AFTER   触发器时机
INSERT DELETE UPDATE 触发的事件
ON 表名   在哪张表上建立触发器 
FOR EACH ROW 触发器执行间隔策略 

1.3 示例演示

#示例2:职员表 (工号,姓名,性别,年龄)  <===>  工资表 (工资编号,姓名,工资5000)    
对职工进行添加时 工资表中也要体现当前职工的信息 
对职工进行修改时 工资表中也要一并修改当前职工的信息 
对职工进行解聘时 工资表中也要一并删除当前员工的工资信息
#创建职工表
CREATE TABLE tab1(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),sex ENUM('m','f'),age INT
);
#创建工资表
CREATE TABLE tab2(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),salary DOUBLE(10,2)
);
#创建触发器1  INSERT  对职工进行添加时 工资表中也要体现当前职工的信息
CREATE TRIGGER tab1_insert_trigger AFTER INSERT ON tab1FOR EACH ROWBEGININSERT INTO tab2 VALUES (NULL,new.name,5000);END;测试用户新增  
INSERT INTO tab1 VALUES (1,'AA','f',18);
新增完成后我们检查tab2会发现有变化#创建触发器2  UPDATE  对职工进行修改时 工资表中也要刷新当前职工的信息
CREATE TRIGGER tab1_update_triggerAFTER UPDATE ON tab1FOR EACH ROWBEGINUPDATE tab2 SET name = new.name WHERE name = old.name;END;测试用户修改
UPDATE tab1 SET name = 'FF' WHERE name = 'BB';
修改完成后我们检查tab2会发现有变化#创建触发器3  DELETE 对职工进行删除时 工资表中也要刷新当前职工信息
CREATE TRIGGER tab1_delete_triggerAFTER DELETE ON tab1FOR EACH ROWBEGINDELETE FROM tab2 WHERE name = old.name;END;

触发器的实际使用也可以参考这篇文章:https://blog.csdn.net/AXDRXS/article/details/135900340

二、存储过程

2.1 什么是存储过程

存储过程指的是事先经过了编译并以对象形式存储在数据库中的一段sql语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少了数据在数据库和应用服务器之间的传输,对于提高数据的处理能力具有很强的好处。

存储过程和存储函数的区别:

1、存储过程可以不设返回值,而存储函数必须要设置返回值

2、存储过程的参数 IN OUT INOUT 类型,而存储函数的参数只能是IN

2.2 优势与应用场景

1、存储过程只在创建时编译一次,而常规的SQL命令每执行一次就会编译一次,所以它能够提高执行效率

2、简化复杂操作,支持封装

3、复用性极强

4、安全性高,可以指定其使用权

场景:(在并发量较小的情况下,很少使用。在并发量高的情况下,多采用存储过程或存储函数)

2.3 存储过程的创建与使用

CREATE PROCEDURE 函数名(形式参数列表)BEGIN函数体END;	参数列表类型  [IN  OUT  INOUT] 参数名 类型	
IN 输入参数
OUT 输出参数
INOUT 该参数在调用方法是充当了实参变量,在方法调用完毕返回结果时又充当了接受返回值的变量
CALL函数名(实际参数列表)
各参数类型所实现的存储过程
======================无参数无返回的存储过程========================
#查询当前学生人数
CREATE PROCEDURE p1()BEGINSELECT COUNT(*) FROM student;END;	
======================有参数无返回的存储过程========================
#创建一张测试表
CREATE TABLE t1(id int,name varchar(50)
);CREATE PROCEDURE autoinsert(IN num INT)BEGINDECLARE i INT DEFAULT 1;          WHILE(i<=num)DOINSERT INTO t1 VALUES(i,md5(i));SET i = i+1;END WHILE;END;		
======================无参数有返回的存储过程========================
#查询当前学生人数
CREATE PROCEDURE p2(OUT num INT)BEGINSELECT COUNT(*) INTO num FROM student;END;
======================有参数有返回的存储过程========================
#统计指定班级编号的学生人数
CREATE PROCEDURE p3(IN num1 INT,OUT num2 INT)BEGIN SELECT COUNT(*) INTO num2 FROM student WHERE student.GradeID = num1;END;
================================INOUT=================================
CREATE PROCEDURE p4(INOUT num INT)BEGIN IF(num IS NOT NULL) thenSET num = num+1;ELSESELECT 100 INTO NUM;END IF;	END;    
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CREATE PROCEDURE p5(INOUT num INT)BEGIN SELECT COUNT(*) INTO num FROM student WHERE student.GradeID = num;END;

三、存储函数

3.1 什么是存储函数

MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。函数和存储过程类似。

存储过程和存储函数的区别:

1、存储过程可以不设返回值,而存储函数必须要设置返回值

2、存储过程的参数 IN OUT INOUT 类型,而存储函数的参数只能是IN

3.2 存储函数的创建与使用

在MySql中创建存储函数使用的关键字 是 CREATE FUNCTION 其基本语法如下:

CREATE FUNCTION 函数名 ([参数名 参数类型,参数名 参数类型....])RETURNS type[characteristic ...]BEGINroutine_bodyEND;参数说明:RETURNS type ====> 返回值的类型characteristic ===> 指定存储函数的特性routine_body ===> SQL代码内容
调用存储函数

在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法基本相同。用户自定义的存储函数与MySQL内部函数性质相同。区别在于,存储函数是用户自定义的。而内部函数由MySQL自带。其语法结构如下:

SELECT NOW();SELECT 函数名(实际参数列表)
删除存储函数
DROP FUNCTION myf2;

3.3 实例演示

注意事项:MySQL开启bin-log后,调用存储过程或者函数以及触发器时,会出现错误号为1418的错误
如何解决此问题:信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求:
在客户端上执行 SET GLOBAL log_bin_trust_function_creators = 1;
#1 =============无参数有返回值==============
#统计student表中行数
CREATE FUNCTION myf1() RETURNS INT
BEGINDECLARE num INT DEFAULT 0; SELECT COUNT(*) INTO num FROM student;RETURN num;
END;	
#2 =============有参数有返回值==============
#根据学生姓名查询学生学号
CREATE FUNCTION myf2(stuName VARCHAR(20)) RETURNS INT
BEGINDECLARE num INT; SELECT id INTO num FROM student WHERE name = stuName;RETURN num;
END;#调用 使用 SELECT命令

四、游标

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。(遍历)

  • 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。

  • 游标充当指针的作用。

  • 尽管游标能遍历结果中的所有行,但他一次只指向一行。

  • 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。

  • 游标机制允许用户逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。

优点

  • 允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。

  • 提供对基于游标位置的表中的行进行删除和更新的能力。

  • 游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

原理

游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。

4.1 如何使用游标

1、声明游标
DECLARE cursor_name CURSOR FOR select_statement (table)
#声明游标
2、声明游标后,想从游标中提取数据,必须要打开游标
xxxxxxxxxx OPEN cursor_name

注意,当我们执行了打开游标操作后,游标并不是指向第一条记录,而是指向第一条记录的前边。

在程序内,一个游标可以打开多次,用户打开游标后,其他用户或程序可能正在更新数据,所以有时候可能导致用户每次打开游标时,显示的结果不同。

3、使用游标

当用户顺利打开游标后,可以使用 FETCH...INTO 语句进行数据的读取

# 这条语句用户指定的打开游标并读取下一行,且前进游标指针。
FETCH cursor_name INTO value1[,value2.....]
4,关闭游标
游标使用完毕后,要及时关闭,在MySQL中,使用CLOSE关键字关闭游标,其语法和格式:
CLOSE cursor_name;

CLOSE 用于释放游标所有的内部资源和内存,因此每个游标再不需要的时候,都需要及时关闭。

关闭的游标 如果没有重新打开,则不能二次使用。但是已经声明过的游标不需要再次声明了,用OPEN语句打开它就可以,如果忘记关闭,MySql将会在到达END语句时自动关闭。游标关闭后,就不能使用FETCH去进行游标的遍历了。

4.2 游标的应用

示例说明:

编写两个表 sys_user和user表,编写其存储过程。当两个表id值一样的时候,将user表内的name字段值同步成 sys_user表的name字段值。

#1创建sys_user表并注入一些数据
CREATE TABLE sys_user(id INT(11) NOT NULL AUTO_INCREMENT,username VARCHAR(200) NOT NULL,PRIMARY KEY(id)
)ENGINE=InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = utf8;INSERT INTO sys_user (username) VALUES ('AA'),('BB'),('CC'),('DD'),('EE'),('FF'),('GG');CREATE TABLE user(id INT(11) DEFAULT NULL,name VARCHAR(200) DEFAULT NULL
)ENGINE=InnoDB DEFAULT CHARSET = utf8;INSERT INTO user VALUES (1,'OO'),(2,'PP'),(3,'QQ'),(4,'RR'),(5,'SS'),(6,'TT'),(7,'UU');

创建存储过程 user_test,并创建游标 cur_test

CREATE PROCEDURE user_test()
BEGIN-- 定义变量DECLARE sys_user_id BIGINT;DECLARE sys_user_name VARCHAR(11);DECLARE done INT;-- 创建游标,并存储数据DECLARE cur_test CURSOR FOR SELECT id AS user_id,user_name AS sys_user_name  FROM `sys_user`;-- 游标中的内容执行完后将 done 设置为 1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;-- 打开游标OPEN cur_test;-- 执行循环posLoop:LOOP-- 判断是否结束循环IF done=1 THENLEAVE posLoop;END IF;-- 取游标中的值FETCH cur_test INTO sys_user_id,sys_user_name;-- 执行更新操作UPDATE `user` SET NAME=sys_user_name WHERE id=sys_user_id;END LOOP posLoop;-- 释放游标 CLOSE cur_test; 
END;

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

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

相关文章

Linux文件结构

所有Linux系统的文件结构都是一样的&#xff0c;区别于win系统的c盘&#xff0c;d盘&#xff0c;他只有一个根目录“/”&#xff0c;下面的文件夹结构基本是一样的&#xff0c;如下&#xff0c;文件夹有“箭头”代表的是软链接&#xff0c;即该文件夹的位置不在此&#xff0c;右…

小米平板6获取root权限教程

1. 绑定账号 1> 打开"设置-我的设备-全部参数-连续点击MIUI版本按钮"&#xff0c;直到提示已打开开发者模式( p s : 这里需要重点关注红框平板型号和 M I U I 版本&#xff0c;例如我这里平板型号是 X i a o m i P a d 6 &#xff0c; M I U I 版本是 14.0.10 &am…

算法——B/排序

一、冒泡排序 A.冒泡思想 冒泡排序的思想是每次将最大的一下一下运到最右边&#xff0c;然后将最右边这个确定下来&#xff0c;再来确定第一大的&#xff0c;再确定第三大…… 对于数组a[ ]&#xff0c;具体的来说&#xff0c;每次确定操作就是从左往右扫描&#xff0c;如果a[…

详解跨域(JSONP和CORS)

一、同源策略 同源策略(Same Origin Policy): 同源是指域名&#xff0c;协议&#xff0c;端口完成一致&#xff0c;那么这两个url就是同源。同源策略是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;也是浏览器故意设置的一个功能限制。如果缺少了同源策…

【开源】JAVA+Vue+SpringBoot实现就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

酷开系统 | 酷开科技智慧AI带你领略神奇的世界

在这个科技日新月异的时代&#xff0c;AI已成为我们生活中不可或缺的一部分。它不仅改变了我们的生活方式&#xff0c;更让我们对未来充满期待。说起酷开系统中智慧AI的强大&#xff0c;着实让人叹为观止。无论是语音识别、数据整理还是语言处理&#xff0c;智慧AI都在不断地突…

MySQL数据库①_MySQL入门(概念+使用)

目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库&#xff0c;服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…

交换机 路由器 网卡 MAC

1. 交换机 (Switch): 交换机是一种局域网设备&#xff0c;用于连接多台计算机和其他网络设备。与集线器不同&#xff0c;交换机能够学习和记忆设备的MAC地址&#xff0c;并且只将数据包发送到目标设备&#xff0c;提高了网络的效率和性能。 逐层转发 (Layer 2 Switching): 交换…

测试大佬是怎么看待测试用例设计的

前言 最近干的最多的事情就是设计测试用例、评审测试用例了&#xff0c;于是我不禁又想到了一个经典的问题&#xff1a;如何设计出优秀的测试用例&#xff1f; 可能有些童鞋看到这个问题会有些不以为然&#xff0c;这有什么好想的&#xff1f;干个测试谁还不会设计测试用例&…

C++(10)——类与对象(最终篇)

目录 static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 经过这么多天的分享&#xff0c;C的类与对象终于要结束了。结束也意味着C快要入门了。 static成员 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之…

mysql二叉树排序例子

⼆叉排序树&#xff0c;理想情况下是⼆分&#xff0c;可能创建时⽐较深&#xff0c;和⼀条线差不多&#xff0c;性能并不⾼。 如果你想在 MySQL 中实现二叉树的排序&#xff0c;一种常见的方法是使用递归查询。以下是一个简单的例子&#xff0c;展示如何对一个具有父子关系的二…

放空自己和终端的clear

clear 造物无言却有情&#xff0c;每于寒尽觉春生。 张维屏《新雷》 没有啥说的&#xff0c;就是放空一下自己&#xff0c;也清空一下终端&#xff0c;仅此而已。 $ clear

基于YOLOv8算法的照片角度分类项目实践

目录 一、任务概述二、YOLOv8算法简介2.1 算法改进2.2 算法特点2.3 网络结构2.4 性能比较 三、工程实践3.1 安装算法框架库ultralytics3.2 库存照片预处理3.2.1 提取所有图片3.2.2 去除冗余的相同照片3.2.3 去除无车辆照片3.2.4 随机提取指定数量的图片 3.3 照片朝向分类3.3.1 …

STM32--USART串口(2)串口外设

一、USART简介 可配置数据位&#xff1a;不需要校验就是8位&#xff0c;需要校验就选9位&#xff1b; 停止位&#xff1a;决定了帧的间隔; STM32F103C8T6USART&#xff1a;USART1挂载在APB2总线上&#xff0c;USART2和USART3挂载在APB1总线上&#xff1b; 二、USART框图 TXE…

excel给数据库初始化/旧数据处理(自动sql拼装)

思路&#xff1a; 首先导出数据到excel编写单条数据操作的sql利用excel CONCATENATE 函数自动生成&#xff0c;每一行数据的操作sql 小技巧:对于需要套娃的字段值&#xff0c;可以加一个临时列同样使用CONCATENATE函数进行sql拼装 案例&#xff1a; 1.临时列:CONCATENATE(C2, …

分库分表 21 条法则,hold 住!

大家好&#xff5e;今天给大家分享分库分表的 21 条法则 我们结合具体业务场景&#xff0c;以t_order表为例进行架构优化。由于数据量已经达到亿级别&#xff0c;查询性能严重下降&#xff0c;因此我们采用了分库分表技术来处理这个问题。具体而言&#xff0c;我们将原本的单库…

【Python小游戏】五子棋小游戏(完整代码)

文章目录 写在前面Tkinter简介五子棋小游戏游戏介绍程序设计运行结果注意事项写在后面写在前面 本期内容:基于tkinter开发一个五子棋小游戏 实验环境 python3.11及以上pycharmtkinterTkinter简介 Tkinter是Python中最常用的图形用户界面(GUI)库之一,用于创建窗口、对话框…

如何搭建私有云盘SeaFile并实现远程访问本地文件资料

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-hsDnDEybLME85dTx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Web项目利用OSS进行图像存储服务

一、OSS介绍 在Web项目中&#xff0c;一些常见的功能&#xff0c;比如展示图片&#xff0c;修改头像等&#xff0c;都需要进行图片的上传操作&#xff0c;但是如果是存储在Web服务器中&#xff0c;在读取图片的时候会占用比较多的资源&#xff0c;影响服务器的性能。 常…

【数据结构】双向带头循环链表实现及总结

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 双向带头循环链表的实现2. 顺序表和链表的区别 1. 双向带头循环链表的实现 List.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h>typede…