关于mysql存储过程中N/A和null的使用注意事项

  oracle和mysql的存储过程大同小异,但是一些细节还是需要留意的。最近发现mysql的N/A和null在存储过程中容易忽略的一点,这会导致我们的存储过程提前结束。今天突然想起来了就记录一下。
  mysql的N/A和null区别网上也说得很详细了,我就不赘述了,只要知道mysql中查不到某条记录的时候,数据库返回值就是N/A:
在这里插入图片描述
如果数据库中能查到某个记录,但是该字段是空的,没有数据:
在这里插入图片描述
  说回去正题,在mysql的存储过程我们经常使用declare continue handler for not found set done = 1;,然后在循环遍历开始的时候使用IF done = 1 THEN LEAVE forloop; END IF;来退出循环(这个done是自定义变量)。这样会存在一个隐患就是,在存储过程中如果任一地方的sql如果没有查到数据(应该说没有查到记录,也即sql的返回值是N/A),那么这个continue handler for not found就会触发,将done设置为1,进而导致提前退出循环。
  看一下以下存储过程的执行结果(执行结果我注释在每个语句后面了):

CREATE DEFINER=`root`@`%` PROCEDURE `test`()
BEGINdeclare ans2 varchar(255);DECLARE done INT DEFAULT 0;declare continue handler for not found set done = 1;select '1',done,ans2;-- 1	0	nullselect fname into ans2 from ib_tbs_tumorreport where fname = '数据库没有fname=此的记录';select '2',done,ans2;-- 2	1	nullselect fname into ans2 from ib_tbs_tumorreport where fname = '数据库没有fname=此的记录';select '3',done,ans2;-- 3	1	nullset ans2:='@@@';select '4',done,ans2;-- 4	1	@@@select fname into ans2 from ib_tbs_tumorreport where fname = '数据库没有fname=此的记录';select '5',done,ans2;-- 5	1	@@@set ans2:=null;select '6',done,ans2;-- 6	1	nullEND

  因此,在遍历游标中并且使用select 字段名 into 变量名 from {表名}的时候,要注意可能出现N/A,也就是没有查到一条记录的情况,这个时候会触发not found条件处理程序(handler),导致提前结束游标遍历。所以当我们希望遍历完整个游标时,可以先使用count(*)判断是否有值,有再进行赋值操作。但是如果每次inset into前都要count(*)一下的话,要多写很多行代码(不过这样方便代码阅读),那么我们可以在任何可能出现N/A的情况使用max(),这样如果没有查到一条记录时候会返回null,不会触发not found条件处理程序

select faddrno from ipaddr where fabbr = '广东省广州市.' -- (N/A)
select max(faddrno) from ipaddr where fabbr = '广东省广州市.' -- (Null)

  上面的存储过程中还要提一点的就是,如果将N/A赋值给一个变量是不生效的,但是如果查询结果是null的话赋值是生效的

  题外话:再贴一段游标和遍历游标处理数据的代码模板(更多请看更多请看):

CREATE DEFINER=`root`@`%` PROCEDURE `p_prepareduty`({你的入参和出参数})
BEGIN#下面定义一些变量用来存你要从游标中取出的字段内容DECLARE for_i int DEFAULT 0;DECLARE cur_fid VARCHAR(50);DECLARE cur_fdate date;DECLARE cur_fcityno VARCHAR(20);DECLARE cur_foverseas VARCHAR(200);DECLARE cur_freason VARCHAR(50);DECLARE cur_fspecial text;DECLARE var_ftaskid VARCHAR(50);#你的其他变量DECLARE done INT DEFAULT 0;#用于退出LOOP循环#DECLARE最后部分是定义你的游标,可以定义静态和动态游标declare cur_bq cursor for select fid,fdate,fcityno,foverseas,freason,fspecial from ib_tbs_prepareduty where ftaskid = ls_ftaskid and fempid = ls_fempid and fifvalid = '1';#静态declare cur_lastbq cursor for select fcityno,foverseas,freason,fspecial from ib_tbs_prepareduty where fempid = ls_fempid and fifvalid = '1' and ftaskid = @parameter;#动态#@parameter是域变量,也就是游标的参数declare continue handler for not found set done = 1;{这里处理你的业务,并且获得你需要的@parameter的值}#下面演示动态游标使用SET @parameter= var_ftaskid;#给动态游标传参open cur_lastbq;#打开游标read_loop:LOOP#循环遍历fetch cur_lastbq into cur_fcityno,cur_foverseas,cur_freason,cur_fspecial;#取出你要的字段IF done = 1 THEN LEAVE read_loop;END IF;#游标遍历完后退出循环{你的其他操作}END LOOP read_loop;  close cur_lastbq;#关闭游标#下面演示静态游标使用open cur_bq;lable1:loopfetch cur_bq into cur_fid,cur_fdate,cur_fcityno,cur_foverseas,cur_freason,cur_fspecial;IF done = 1 THEN LEAVE lable1;END IF;{你的其他操作}end loop lable1;close cur_bq;
END

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

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

相关文章

服务器的安全包括哪些方面?服务器安全该如何去加固处理?

服务器安全包括如下几个方面: 系统安全:包括操作系统的安全性、系统的漏洞和补丁管理、用户管理、文件权限和访问控制等。 网络安全:包括网络拓扑结构、网络设备的安全性、网络协议的安全性、防火墙和入侵检测等。 数据安全:包括数…

【ArkTS】如何修改应用的首页

之前看到一种说法,说是应用首页是 entry > src > main > resources > base > profile > main_pages.json 中src配置中数组第一个路径元素。这种说法是不对的!!! 如果需要修改应用加载时的首页,需要…

python提取图片型pdf中的文字(提取pdf扫描件文字)

前言 文字型pdf提取,python的库一大堆,但是图片型pdf和pdf扫描件提取,还是有些难度的,我们需要用到OCR(光学字符识别)功能。 一、准备 1、安装OCR(光学字符识别)支持库 首先要安…

使用Verdaccio搭建私有npm仓库

搭建团队的私有仓库,保证团队组件的安全维护和私密性,是进阶前端开发主管路上,必不可少的一项技能。 一、原理 我们平时使用npm publish进行发布时,上传的仓库默认地址是npm,通过Verdaccio工具在本地新建一个仓库地址…

golang os 包用法

Go语言的os包提供了许多用于与操作系统交互的功能。这个包涵盖了文件操作、环境变量、进程等许多方面。以下是一些os包的基本用法: 文件操作 创建文件 file, err : os.Create("filename.txt") if err ! nil {// 处理错误 } defer file.Close()打开文件…

SearchWP WooCommerce电商商城搜索集成

点击阅读SearchWP WooCommerce电商商城搜索集成原文 SearchWP WooCommerce电商商城搜索集成使用帖子类型存档模板来促进搜索结果。此扩展允许 SearchWP 通过 WooCommerce 使用此默认行为。此扩展还结合了 WooCommerce 搜索的其他功能,例如分层导航。 如果您使用本…

pytorch——支持向量机

1、任务要求 针对已知类别的5张卧室照片(标签为1)和5张森林照片(标签为-1)所对应的矩阵数据进行分类训练,得到训练集模型;再利用支持向量机对另外未知类别的5张卧室照片和5张森林照片数据进行测试分类(二分类),得到分类结果及其准确率。 2、先导入查看基本数据 3、…

Pycharm 如何更改成中文版| Python循环语句| for 和 else 的搭配使用

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

Linux权限(上)

目录 shell命令以及运行原理 Linux权限 Linux中的用户类别 文件类型 文件的访问权限 在讲权限之前,我们得先了解一下命令的执行原理。 shell命令以及运行原理 我们每次在打开Xshell执行相关命令时,通常会看到这样一段代码: [yjdhecs…

宏基因组学Metagenome-磷循环Pcycle功能基因分析-从分析过程到代码及结果演示-超详细保姆级流程

大背景介绍 生信分析,凡事先看论文,有了论文就有了参考,后续分析就有底了,直接上硬菜开干: PCycDB: a comprehensive and accurate database for fast analysis of phosphorus cycling genes - PubMed 数据库及部分分析代码github库: GitHub - ZengJiaxiong/Phospho…

AUTOSAR从入门到精通-诊断事件管理模块(DEM)(五)

目录 DEM基本架构 DEM功能描述 故障的Report 故障的Debounce DTCStausByte 故障存储

算法往年题复习(一)| 看不懂来 Gank 我

文章目录 数组逆序差的最大值题目描述算法思路与过程实现代码时间复杂度类似题型 将 K 个数组元素有序输出题目描述算法思路与过程实现代码时间复杂度类似题型 二叉搜索树题目描述算法思路与过程实现代码时间复杂度涉及知识点 天然气输气管道网络题目描述算法思路与过程实现代码…

【TB作品】51单片机,具有报时报温功能的电子钟

2.具有报时报温功能的电子钟 一、功能要求: 1.显示室温。 2.具有实时时间显示。 3.具有实时年月日显示和校对功能。 4.具有整点语音播报时间和温度功能。 5.定闹功能,闹钟音乐可选。 6.操作简单、界面友好。 二、设计建议: 1.单片机自选(C51、STM32或其他单片机)。 2.时钟日历芯…

H266/VVC标准的编码结构介绍

概述 CVS: H266的编码码流包含一个或多个编码视频序列(Coded Video Swquence,CVS),每个CVS以帧内随机接入点(Intra Random Access Point, IRAP)或逐渐解码刷新(Gradual …

结构型设计模式(二)装饰器模式 适配器模式

装饰器模式 Decorator 1、什么是装饰器模式 装饰器模式允许通过将对象放入特殊的包装对象中来为原始对象添加新的行为。这种模式是一种结构型模式,因为它通过改变结构来改变被装饰对象的行为。它涉及到一组装饰器类,这些类用来包装具体组件。 2、为什…

HTML5面试题

HTML5面试题 什么是HTML5?它与HTML4有何不同之处? HTML5是HTML的第五个主要版本,它引入了许多新的语义化元素、API和功能,以改进网页的结构、样式、交互和多媒体体验。 HTML5与HTML4的不同之处包括: 引入了一系列新的语…

亚马逊云科技发布企业生成式AI助手Amazon Q,助力企业迈向智能化时代

(声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区、知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道) 一、前言 随着人工智能技术的快速发展和广泛应用,我们…

使用OpenSSL生成PKCS#12格式的证书和私钥

要使用OpenSSL生成PKCS12格式的证书和私钥,可以按照以下步骤进行操作: 1. 安装OpenSSL 首先,确保已在计算机上安装了OpenSSL。可以从OpenSSL官方网站(https://www.openssl.org/)下载并安装适用于您的操作系统的版本。…

04_Web框架之Django一

Web框架之Django一 学习目标和内容 1、能够描述Django的作用 2、能够使用Django创建应用 3、能够使用GET和POST请求方式进行传参 4、能够使用Django的函数式方法定义视图 5、能够进行Django的配置文件修改 6、能够基本使用Django的路由定义 一、Django相关介绍 1、什么是Djan…

ArrayList vs. LinkedList: Java集合框架的比较与应用

目录 1. ArrayList简介 2. LinkedList简介 3. 内部实现方式 3.1 ArrayList的内部实现 3.2 LinkedList的内部实现 4. 时间复杂度比较 4.1 插入和删除操作 4.2 随机访问操作 5. 内存消耗 5.1 ArrayList的内存消耗 5.2 LinkedList的内存消耗 6. 适用场景 6.1 ArrayLi…