`
丁林.tb
  • 浏览: 794788 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL非源码学习:关于存储过程的中游标两个容易忽略的点

阅读更多

今天写个稍微复杂一点点的存储过程碰到两个容易忽略的点分享一下。如果有筒子刚好碰到相同的问题可以少再纠结一下, 木有啥技术含量的。。。

 

1、一个存储过程使用游标的例子

假设很简单的一个要求:从t表里面遍历出f,然后再到t2表中查找符合条件的记录打出来。

 

declare stopFlag int;

DECLARE  cur_name CURSOR for f from t;

DECLARE CONTINUE HANDLER FOR NOT FOUND set stopFlag=1;

set stopFlag=0;

open cur_name;

REPEAT

FETCH cur_name INTO temp_f;

begin

   select f3 into my_result from t2 where f2=temp_f  limit 1;

end;

UNTIL stopFlag = 1

END REPEAT;

CLOSE cur_name;

 

2、 1

假设t表有n条记录,这个循环体循环n次?

实际上是n+1次。因为到达t的最后一行的时候stopFlag还是1。这个值的修改是在下一次fetch的时候改的,但是改完后就进入begin了,没有再判断,所以会多执行一次。这多出来的一次的temp_f的值和上一次相同。

 

解决方法:在进入Begin之后再判断一下stopFlag的值

 

3、 2

有时候会发现没有循环到n次循环就退出,什么原因?

原因是如果select f3 into my_result from t2 where f2=temp_f  limit 1; 条件无法匹配行,在试图对my_result赋值的时候就会触发set stopFlag=1; 导致在之后的until判断的时候满足退出条件而退出。

 

解决方法:特别小心循环体内部出现的这种语句。如果有的话,在进入begin之后把stopFlag存入一个临时变量,在until之前把这个临时变量赋回去就行了

1
2
分享到:
评论
2 楼 ForgiDaved 2015-03-11  
   点赞啊,刚好遇到这两个问题, 折磨死人了,感谢感谢
1 楼 zhuorulin 2011-09-27  
这两个问题在做DB移值的时候遇到过。
丁兄,再请教一个问题,oracle到mysql的移植,其中一个function用了动态sql,而在mysql里面的function里不可使用“准备语句”替换,但因为项目原因,不可以把function对等换成procedure,不知道有什么好方法没?

相关推荐

    mysql存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元,从而提高数据处理的效率和代码的复用性。本教程将深入探讨MySQL存储过程的创建、调用以及相关概念...

    MySQL存储过程学习

    在这个"MySQL存储过程学习"的主题中,我们将深入探讨存储过程的定义、创建、调用以及其在数据库管理中的实际应用。 首先,理解存储过程的基本概念是至关重要的。存储过程是一组为了完成特定功能的SQL语句集合,这些...

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...

    MySQL存储过程编程.pdf

    MySQL 存储过程编程 MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的...通过学习 MySQL 存储过程编程,可以提高开发者的编程能力和数据库管理能力,并且可以提高数据库的安全性和可维护性。

    mysql存储过程实现计算两个时间相差,并用年月日时分秒格式输出

    mysql获取两个时间相差年月日:使用mysql存储过程,实现计算两个时间的差值,并用年月日时分秒的格式输出,且从大到小为0时则不展示对应单位(如:相差1小时20秒 则展示'1时0分20秒')

    MySQL存储过程学习资料

    在学习过程中,你可以通过实例练习来熟悉这些概念,例如创建一个简单的存储过程来计算两个数字的和,或者创建一个复杂的存储过程来处理多表之间的数据操作。同时,了解如何在实际项目中应用存储过程,将有助于你更好...

    MySql5.5源码安装包

    以下是对MySQL 5.5源码安装的详细过程和相关知识点: 1. **源码获取**: - `mysql-5.5.43.tar.gz` 是MySQL 5.5.43版本的源代码压缩包,由于官方下载链接可能不可用,因此这种分享方式对于开发者来说非常宝贵。 2....

    MYSQL源码包:mysql-4.0.18.tar.gz

    由于MYSQL的源码包太大,一次上传不了,所以我做了分段压缩,这是第一段,请将两段一起下完解压使用。mysql源码包与Apache和PHP源码包一起安装可以搭建完整的Apache服务,另外两个我也有上传,谢谢关注!

    MySQL学习源码(MySQL入门教程).zip

    MySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL学习源码(MySQL入门教程).zipMySQL...

    MySQL存储过程

    MySQL存储过程是数据库管理系统中的一种预编译的代码集合,它允许开发者定义一系列的SQL语句,形成一个可重用的程序单元。在MySQL中,存储过程可以接收参数,执行复杂的逻辑,甚至可以包含控制流语句,如条件判断和...

    MySQL源码学习讲义.rar_MYSQL_mysql 源码

    MySQL源码学习讲义是一个关于深入理解MySQL数据库系统内核的资源集合,主要针对对数据库原理和MySQL实现感兴趣的开发者或数据库管理员。这份讲义可能是PDF文档形式,包含了MySQL的源码分析、设计原理以及实现机制的...

    前端:Uniapp 开发 后端:JAVA 数据库:MySQL 源码类型:WinForm 后台管理功能:

    前端:Uniapp 开发 后端:JAVA 数据库:MySQL 源码类型:WinForm 后台管理功能:

    mysql源码(mysql-8.2.0.tar.gz)

    MySQL 8.2.0的源码分析将涉及多个关键知识点: 1. SQL解析与执行:MySQL的核心在于其SQL解析器,它将用户输入的SQL语句转换成可执行的计划。这部分源码揭示了如何解析各种SQL语句,包括SELECT、INSERT、UPDATE、...

    mysql源码安装脚本

    MySQL源码安装脚本涉及了数据库管理系统MySQL的安装过程,主要通过shell脚本来自动化操作,以提高效率并减少手动配置的复杂性。在Linux环境中,源码安装是一种常见且灵活的安装方式,允许用户自定义编译选项和依赖项...

    MySQL存储过程编程教程.pdf

    MySQL存储过程编程是数据库应用开发中的一个重要环节,它可以帮助开发者将一系列的数据库操作封装起来,以提高程序的可维护性和运行效率。在MySQL 5.0及以上版本中,存储过程、函数和触发器的支持为数据库提供了更...

    mysql源码 和 redis 源码学习工程.zip

    这里我们将深入探讨这两个源码的学习工程。 MySQL源码分析: 1. **SQL解析**:MySQL的解析器负责将SQL语句转化为可执行的抽象语法树(AST)。源码中,你可以看到词法分析和语法分析的过程,这对于理解SQL如何被处理...

    linux下mysql的操作与存储过程

    例如,创建一个返回两个数字之和的存储过程: ``` DELIMITER // CREATE PROCEDURE add_numbers(IN num1 INT, IN num2 INT, OUT result INT) BEGIN SET result = num1 + num2; END // DELIMITER ; ``` 2. ...

    易语言MYsql全功能操作源码两例程

    学习这两个源码实例,可以帮助读者掌握易语言与MySQL的结合使用,提升数据库管理能力。通过阅读源码,了解其实现逻辑,可以加深对数据库操作的理解,并为实际项目开发积累经验。 总结,易语言结合MySQL的源码学习,...

    源码安装mysql5.6

    ### 源码安装MySQL 5.6详细步骤与知识点解析 #### 一、环境准备与检查 在开始安装MySQL 5.6之前,确保Linux系统满足以下条件: 1. **GCC版本检查**:通过`rpm -qa | grep gcc`命令来确认已安装的GCC版本。示例中...

    java mysql驱动源码

    Java MySQL驱动源码是连接Java应用程序与MySQL数据库的关键组件,其主要实现是通过JDBC(Java Database Connectivity)接口。在Java中,JDBC提供了一组API,使得开发人员能够用标准的Java语言来访问和操作各种数据库...

Global site tag (gtag.js) - Google Analytics