SQL中的游标、异常处理、存储函数及总结

news2024/10/2 10:30:28

目录

一.游标

格式

操作

 演示

二.异常处理—handler句柄

格式

 演示

 三.存储函数

格式

 参数说明

演示

四.存储过程总结


 

一.游标

游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和 CLOSE.

格式

 

操作

 演示

use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc21(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	fetch my_cursor into var_empno,var_ename,var_sal;
	select var_empno,var_ename,var_sal;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;

call proc21('销售部');

运行输出的结果是

但是

 我们发现符合要求的有多个值,这是因为游标是一条条往下执行的所以我们可以用一个循环

use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc21(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	label:loop
	fetch my_cursor into var_empno,var_ename,var_sal;
	select var_empno,var_ename,var_sal;
	end loop label;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;

call proc21('销售部');

 结果会报错

No data - zero rows fetched, selected, or processed 这句话意思是没有数据 零行 读取 选择或处理,就是说循环到最后没值了,所以我们需要找到一个条件并及时退出循环,这就需要异常处理—handler句柄。

二.异常处理—handler句柄

格式

 注意

在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。

--定义句柄:定义异常的处理方式

1:异常处理完之后程序该怎么执行
        continue :继续执行剩余代码

        exit :直接终止程序
        undo:不支持
2:触发条件

条件码:1329

条件名:
        SQLWARNING

        NOT FOUND

        SQLEXCEPTION

 演示

-- 用条件名
use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc22(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);

	-- 定义标记值
	declare flag int default 1;
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 定义句柄,当数据未发现时将标记位设置为0
	declare continue handler for  not found set flag=0;

	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	label:loop
	fetch my_cursor into var_empno,var_ename,var_sal;
	if flag=1 then
		select var_empno,var_ename,var_sal;
	else
		leave label;
	end if;
	end loop label;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;

call proc22('销售部');



-- 用条件码
use test_procedure ;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
delimiter $$
create procedure proc23(in in_name varchar(50))
begin
	-- 定义局部变量
	declare var_empno int;
	declare var_ename varchar(50);
	declare var_sal decimal(7,2);

	-- 定义标记值
	declare flag int default 1;
	-- 声明游标
	declare my_cursor cursor for
	select empno ,ename ,sal  from emp e,dept d where d.dname =in_name ;
	-- 定义句柄,当数据未发现时将标记位设置为0
	declare continue handler for  1329 set flag=0;

	-- 打开游标
	open my_cursor;
	-- 通过游标获得值
	label:loop
	fetch my_cursor into var_empno,var_ename,var_sal;
	if flag=1 then
		select var_empno,var_ename,var_sal;
	else
		leave label;
	end if;
	end loop label;
	-- 关闭游标
	close my_cursor;
end $$
delimiter ;

call proc23('销售部');

两个的运行结果是一样的

 三.存储函数

格式

在MySQL中,创建存储函数使用create function关键字,其基本形式如下:

 参数说明

(1) func_name :存储函数的名称。
(2) param_name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。
(3)returns type:指定返回值的类型。
(4)characteristic:可选项,指定存储函数的特性。
(5)routine_body: SQL代码内容。

演示

drop function if exists myfunc1_emp;
delimiter $$
create function myfunc1_emp() returns int
begin
	declare cnt int default 0;
	select count(*) into cnt from emp;
	return cnt;
end $$
delimiter ;

运行结果可以会报错,像这样

 意思是说“此函数在其声明中没有确定性、无 SQL 或读取 SQL 数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的 log_bin_trust_function_creators 变量)”

所以我们设置允许创建函数权限信任即可

-- 允许创建函数权限信任
set global log_bin_trust_function_creators=true ;

-- 允许创建函数权限信任
set global log_bin_trust_function_creators=true ;

drop function if exists myfunc1_emp;
delimiter $$
create function myfunc1_emp() returns int
begin
	declare cnt int default 0;
	select count(*) into cnt from emp;
	return cnt;
end $$
delimiter ;

-- 调用存储函数
select myfunc1_emp();

 这样就可以了

四.存储过程总结

 

 

 

 

 

 

 

 

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

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

相关文章

ThingsBoard-规则链-check relation

1、概述 今天我主要讲解【check relation】规则节点,顾名思义,这个节点就是检查消息的发起者与其他实体之间的关系是否存在。如果勾了“检查与特定实体的关系”,则必须指定相关实体。否则,规则节点检查是否存在与匹配方向和关系类型标准的任何实体的关系。一般情况,我们都…

C++递归算法回溯思想

文章目录一、最简单的递归问题(调用函数后无其他代码、不涉及复杂的回溯思想)二、递归函数中的return不是结束整个递归函数哦三、递归(涉及回溯)举例学生的年龄问题(递归的执行过程)四、涉及较复杂的回溯思想楼梯问题一、最简单的…

Zookeeper (更新中)

目录Zookeeper 概述Zookeeper 的特点Zookeeper 的应用场景Zookeeper的数据结构ZNode数据类型ZNode里面存储的信息Zookeeper的选举机制(重要)Zookeeper第一次启动选举机制Zookeeper非第一次启动选举机制Zookeeper 底层如何按照请求的先后顺序来处理的Zook…

计算机SCI期刊审稿人,一般关注论文的那些问题? - 易智编译EaseEditing

编辑主要关心: (1)文章内容是否具有足够的创新性? (2)文章主题是否符合期刊的受众读者? (3)文章方法学是否合理,数据处理是否充分? (…

3|射频识别技术|第五讲:数据通信和编码技术|第九章:编码与调制|重点理解掌握传输介质中的有线传输介质

计算机网络部分:https://blog.csdn.net/m0_57656758/article/details/128943949传输介质分为有线传输介质和无线传输介质两大类;有线传输介质通常包含双绞线、同轴电缆和光导纤维;无线传输介质包含微波、红外线等。传输介质的选择和连接是网络…

02Hadoop环境搭建

版本 hadoop-3.1.3.tar.gz解压安装文件到/opt/module下面 [sarahhadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/将Hadoop添加到环境变量 (1)获取Hadoop安装路径 [sarahhadoop102 hadoop-3.1.3]$ pwd /opt/module/hadoop-3.1.3&…

Toolformer: Language Models Can Teach Themselves to Use Tools

展示了LM可以通过简单的API教自己使用外部工具,并实现两个世界的最佳效果。我们介绍了Toolformer,这是一个经过训练的模型,可以决定调用哪些API,何时调用,传递哪些参数,以及如何将结果最好地纳入未来的标记…

Spring Cloud Alibaba环境搭建

环境依赖 SpringCloud Alibaba 依赖 Java环境来运行。还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用: 1. 64 bit JDK 1.8;下载& 配置。 1.8.0_131 2. Maven 3.2.x;下载& 配置搭建微服务 1.建立微服务项目 1.idea通过…

yolov5编译安卓APP:解决图像上全是检测框

yolov5编译安卓APP:解决图像上全是检测框前言一、第一个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法二、第二个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法三、其他1.APK打包2.修改APP图标与名字前言 YOLOv5编译安卓A…

【精选论文 | Capon算法与MUSIC算法性能的比较与分析】

本文编辑:调皮哥的小助理 【正文】 首先说结论: 当信噪比(SNR)足够大时,Capon算法和MUSIC算法的空间谱非常相似,因此在SNR比较大时它们的性能几乎一样,当不同信号源的入射角度比较接近时&…

蓝桥杯刷题024——天干地支

2020国赛 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(w&#xff09…

IO知识整理

IO 面向系统IO page cache 程序虚拟内存到物理内存的转换依靠cpu中的mmu映射 物理内存以page(4k)为单位做分配 多个程序访问磁盘上同一个文件,步骤 kernel将文件内容加载到pagecache多个程序读取同一份文件指向的同一个pagecache多个程…

MySQL(五)

通过索引进行优化 索引基本知识 索引的优点 1、大大减少了服务器需要扫描的数据量2、帮助服务器避免排序和临时表3、将随机io变成顺序io 索引的用处 1、快速查找匹配WHERE子句的行2、从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到…

【Python爬虫案例教学】采集某网站壁纸,实现壁纸自由

前言 (。・∀・)ノ゙嗨 大家好,这里是小圆 现在开始每天都给大家 分享些关于python爬虫的案例教学 从最简单的开始 — 采集图片壁纸 今天就来扒拉这个优质的壁纸网站~ 网址 👇 顺便瞧一眼 这里的…

30 - 面向对象的其他语法

目录 一、本章重点 二、对象的分类 1、类对象 (1)理解 (2)作用 2、实例对象 (1)理解 三、属性的划分 1、实例属性 (1)概念 (2)定义 (3&#xff09…

操作系统的概念,功能和目标

一、概念: 操作系统是指①控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以②提供给用户和其他软件方便的接口和环境,它③是计算机系统中最基本的系统软件。 二、功能和目标:…

零入门kubernetes网络实战-14->基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章继续提供测试案例: 基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信 1、网络拓扑如下 2、网络拓扑构建…

【第二章】(1)了解系统内核和 Shell 终端的关系与作用

🐧2.1强大好用的Shell🧊1.什么是Shell?🧊2.Bash解释器的优势🐧2.2 执行命令的必备知识🧊1.Linux命令的格式🧊2.四个快捷键/组合键小技巧🧊1.什么是Shell? ​ 一台…

shell脚本的编写以及shell中语句(嵌入式学习)

shell学习shell脚本编写步骤shell变量功能性语句1.read2.expr3.let4.test逻辑运算符的书写格式结构性语句1.if…then…fi2、case...esac3、for..do..done4、while..do..doneshell脚本 将shell命令按照一定的逻辑顺序实现指定功能,放到一个文件中。文件叫脚本文件&a…

几个Base64编码工具,也有蹊跷

起因 需求:对一段内容进行base64加密,然后通过url的get请求进行发送到后台,由于加密的内容比较少,base64串也不是很长,我认为此方案可行。 于是找了三个base64编码的在线工具,分别是: 平台1&…