`

介绍mysql 存储过程、函数

 
阅读更多

Mysql从 5.0 开始支持存储过程和 trigger ,给我们喜欢用 mysql 的朋友们更喜欢 mysql 的理由了,语法  
上和PL/SQL 有差别,不过搞过编程的人都知道,语法不是问题,关键是思想,大致了解语法后,就从  
变量定义,循环,判断,游标,异常处理这个几个方面详细学习了。关于游标的用法Mysql 现在提供  
的还很特别,虽然使用起来没有PL/SQL 那么顺手,不过使用上大致上还是一样。


定义游标 
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;  
使用游标 
open fetchSeqCursor;  
fetch数据: 
fetch fetchSeqCursor into _seqname, _value;  
关闭游标: 
close fetchSeqCursor; 


       不过这都是针对cursor 的操作而已,和 PL/SQL 没有什么区别吧,不过光是了解到这个是根本不足以  
写出Mysql 的 fetch 过程的,还要了解其他的更深入的知识,我们才能真正的写出好的游标使用的 proc  
edure  

       首先fetch 离不开循环语句,那么先了解一下循环吧。 我一般使用Loop 和 while 觉得比较清楚,而且代码简单。 这里使用Loop 为例: 
fetchSeqLoop:Loop 
    fetch fetchSeqCursor into _seqname, _value;  
end Loop; 


现在是死循环,还没有退出的条件,那么在这里和oracle 有区别, Oracle 的 PL/SQL 的指针有个隐性变量%notfound , Mysql 是通过一个 Error handler 的声明来进行判断的,  
declare continue handler for Not found (do some action);  
在Mysql 里当游标遍历溢出时,会出现一个预定义的 NOT FOUND 的 Error ,我们处理这个 Error 并定义一个continue 的 handler 就可以叻,关于 Mysql Error handler 可以查询 Mysql 手册 定义一个flag ,在 NOT FOUND ,标示 Flag, 在 Loop 里以这个 flag 为结束循环的判断就可以叻。  

declare fetchSeqOk boolean; ## define the flag for loop judgement  
declare _seqname varchar(50); ## define the varient for store the data  
declare _value bigint(20);  
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;# define the cursor  
declare continue handler for NOT FOUND set fetchSeqOk = true; #define the continue handler for not found flag  
set fetchSeqOk = false;  

open fetchSeqCursor;  
fetchSeqLoop:Loop

fetch fetchSeqCursor into _seqname, _value;  
if fetchSeqOk then  
    leave fetchSeqLoop;  
else      
    select _seqname, _value;  
end if;  
end Loop;  
close fetchSeqCursor;  

这就是一个完整的过程叻,那么会思考的人一般在这里都会思考,如果是这样的话,怎样做嵌套的游 标循环叻,这里可以根据statement block 的 scope 实现叻, Mysql 里通过 begin end 来划分一个 statem ent block,在 block 里定义的变量范围也在这个 block 里,所以关于嵌套的游标循环我们可以多加一 个begin end 来区分他们所对应的error handler( 注意在 Mysql 里同一个 error 的 handler 只能定义一次, 多定义的话,在compile 的过程中会提示里duplicate handler defination ,所以 NOT FOUND 的 hand ler就只能定义一次 ) ,在一个 begin end 里定义这个里面游标的 NOT FOUND handler ,  

declare fetchSeqOk boolean; ## define the flag for loop judgement  
declare _seqname varchar(50); ## define the varient for store the data  
declare _value bigint(20);  
declare fetchSeqCursor cursor for select seqname, value from sys_sequence;## define the cursor  
declare continue handler for NOT FOUND set fetchSeqOk = true; #define the continue handler for not found flag  
set fetchSeqOk = false;  

open fetchSeqCursor;  
fetchSeqLoop:Loop

fetch fetchSeqCursor into _seqname, _value;   
if fetchSeqOk then  
  leave fetchSeqLoop;  
else 
  begin  
   declare fetchSeqOk boolean default 'inner';  
   declare cursor2 cursor for select .... from ...;## define the cursor  
   declare continue handler for NOT FOUND set fetchSeqOk = true; #define the continue handler for n ot  
   set fetchSeqOk = false;  
   open cursor2;  
   fetchloop2 loop  
    if fetchSeqOk then  
    else  
    end if;  
   end loop;  
   close cursor2;  
  end;  
end if;  
end Loop;  
close fetchSeqCursor;  

这样就可以轻松实现更多层次的循环了,不过相对oracle 的 PL/SQL 来说, Mysql 现在还不支持动态游  
标的定义,所以很强大的动态拼出SQL 的在游标里还不能做到,不过这完全不影响我对 Mysql 的喜爱程  
度,她就想那羞涩的荷花一样,虽然没有灿烂的色彩,但那简约的色调,清新而不染一丝铅尘的高雅  
,一样吸引着无数的mysql 迷么,正如接天莲叶无穷碧,映日荷花别样红。  

 

 :Mysql 也有类似 Oracle 里的 execute immediate 的动态 SQL 的功能,通过这个功能可有多少弥补一  
些动态游标的缺憾叻  
set @sqlStr='select * from table where condition1 = ?';  
prepare s1 for @sqlStr;  
execute s1 using @condition1; 如果有多个参数用逗号分隔  
deallocate prepare s1; 手工释放,或者是 connection 关闭时, server 自动回收

分享到:
评论

相关推荐

    Mysql存储过程和函数

    本文将详细介绍MySQL存储过程与函数的相关概念、创建方法以及使用技巧。 #### 二、存储过程与函数的区别 - **存储过程**(Stored Procedure):是一系列SQL语句的集合,它可以接受输入参数并返回多个结果集和...

    mysql存储过程和存储函数

    mysql存储过程,存储函数练习,里面有详细代码,供大家参考

    mysql存储过程之返回多个值的方法示例

    mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+--------...

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

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

    mysql存储过程和存储函数的示例

    mysql 存储过程 ,存储函数的调用示例

    精通MySQL存储过程和函数

    ### 精通MySQL存储过程和函数 #### 1. 说明 ##### 1.1 手册适用范围 本手册适用于对MySQL存储过程和函数感兴趣的开发者和技术人员,特别是那些希望深入了解并掌握如何在实际项目中高效利用这些功能的专业人士。...

    第11章MySQL存储过程与函数.docx

    MySQL 存储过程与函数 MySQL 存储过程和函数是数据库中定义的一组用户定义的 SQL 语句集合。它们之间的区别在于: 1. 存储过程实现的功能要复杂一点,而函数实现的功能针对性比较强。 2. 存储过程可以返回参数,而...

    MySQL存储过程的异常处理方法

    本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...

    Mysql 存储过程(输入,返回),函数,临时表

    Mysql 存储过程,函数,临时表 存储过程包括输入返回,可供项目中遇到难题的人解决一下,我曾为此费了好大精力,最后总结出来共大家分享

    mysql存储过程教程

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

    MySQL数据库函数,触发器,存储过程

    通过深入学习和掌握MySQL的函数、触发器和存储过程,开发者能够更加高效地管理和操作数据库,解决复杂的数据处理问题,提升应用程序的性能。在实际项目中,熟练运用这些特性是数据库设计和优化的关键。通过"mysql...

    MySql存储过程和函数

    MySQL存储过程和函数是数据库管理中的重要组成部分,它们在数据处理和业务逻辑中扮演着核心角色。本篇文章将深入探讨这两个概念,以及它们在MySQL环境中的应用和差异。 首先,让我们了解一下存储过程。存储过程是一...

    JAVA通过MyBatis调用MySql存储过程和函数doc文档合集整理.zip

    这个文档合集应该详细讲解了这些步骤和最佳实践,帮助开发者熟练掌握在Java中利用MyBatis调用MySQL存储过程和函数的技巧,从而更高效地进行数据库操作。通过深入学习和实践,开发者可以更好地理解这两者之间的交互,...

    Mysql手册20-存储过程和函数

    MySQL存储过程和函数是数据库编程的重要组成部分,它们提供了在数据库服务器上执行特定任务的能力。本部分详细介绍了存储程序和函数的各个方面,包括它们的创建、语法、权限控制以及与性能优化相关的概念。 首先,...

    mysql过程,函数debug工具

    mysql过程,函数debug工具

    mysql存储函数以及函数过程

    mysql+零基础+mysql存储函数以及函数过程知识点

    mysql中文手册+mysql命令大全+mysql存储过程

    最后,"mysql存储过程.pdf"专注于MySQL的存储过程。存储过程是预编译的SQL语句集合,可以提高数据库操作的性能,减少网络流量,并增强数据安全。在PDF文档中,你将学习如何定义、调用和管理存储过程,以及如何使用...

    MySQL触发器、存储过程、自定义函数、视图示例

    #### 二、MySQL存储过程 存储过程是一组预编译的SQL语句,它们可以作为一个单元调用并执行。使用存储过程可以提高代码重用性和执行效率,并且可以封装复杂的逻辑处理。 **示例:** 本例中创建了一个存储过程`sp_...

Global site tag (gtag.js) - Google Analytics