提示:本文是利用业余时间写的,SQL代码是我直接敲的,没有实际执行过,我将会进行修改。谢谢各位。本人也是初学mysql存储过程,把自己在学习过程中遇到的问题总结下来,希望对各位同学提供帮助。
1、MySql存储过程创建
通过以下简单的例子,来简单学习并创建一个简单的存储过程,从执行结果中可以得到table_name的最大id。
DROP PROCEDURE IF EXISTS proc_name;
DELIMITER //
CREATE PROCEDURE proc_name() -- 创建存储过程 参数([in|out|inout] 参数 datatype) 本例子不涉及in 和 out 参数
BEGIN
DECLARE maxId int(10) DEFAULT 0; -- 声明变量 maxId
SELECT MAX(id) INTO maxId FROM table_name; -- 从表中查询最大的id 放到变量maxId中
SELECT maxId; -- 输入maxId的值
END //
DELIMITER ;
2、游标的使用
我们从t_user表中查询status为CANCEL的,删除所有t_user_history对应的数据
DROP PROCEDURE IF EXISTS proc_del_userhistory;
DELIMITER //
CREATE PROCEDURE proc_del_userhistory() -- 创建存储过程数
BEGIN
DECLARE userId int(10) DEFAULT 0; -- 声明变量 userId
DECLARE userStatus char(10) DEFAULT ''; -- 声明变量 userStatus
DECLARE deleteStatus char(10) DEFAULT 'CANCEL'; -- 声明要删除状态的值
DECLARE stopFlag int(1) DEFAULT 0; -- 循环停止标志,可以不声明
DECLARE user_cursor CURSOR FOR SELECT id,status FROM t_user; -- 声明游标user_cursor
SET deleteStatus = 'CANCEL'; -- 如果default没设值,这里也可以设置哦。
OPEN user_cursor; -- 打开游标
REPEAT -- 这里采用REPEAT循环游标
FETCH user_cursor INTO userId,userStatus ; -- fetch取值 把当前的值放到userId中
IF stopFlag <> 1 THEN -- 判断是否还有数据 防止多循环一次
-- 这里为了学习,把状态的判断放到IF 语句中,同学们自己写代码时,一定要放到where 语句中哦。。
IF userStatus = deleteStatus THEN
DELETE FROM t_user_history WHERE user_id = userId;
END IF;
END IF;
UNTIL stopFlag=1 END REPEAT; -- 循环结束条件
CLOSE user_cursor; -- 关闭光标
END //
DELIMITER ;
我想经过这个例子,大家一般的存储过程都可以写了。接下来,我分享一下自己在存储过程中遇到的比较难以解决的问题
3、游标循环次数多一次
主要是循环的时候,条件判断的问题,可参考上面例子的处理方式(IF stopFlag <> 1 THEN -- 判断是否还有数据 防止多循环一次)
4、游标循环次数比预期少(针对次数少的情况)
这种情况出现一般出现的循环光标中,存在SELECT操作,由于概念不清导致的。参考http://hi.baidu.com/kankin/blog/item/1e0eac036338cff109fa93d0.html
部分代码:
declare flag boolean;
declare continue handler for NOT FOUND set flag = false; -- 每次fetch操作,mysql都判断根据 NOT FOUND 异常,如果发送则设置为flag = false
set flag = true;
open cur;
fetch cur into userId;
while flag do
select id into accountId from t_user_account where id = userId; -- 这里如果没有取到数据,亦会报NOT FOUND 异常把 flag 设为false,导致循环提前退出
if accountId is not null then
do coding....
end if;
fetch cur into userId;
select fetchOk;
end while;
解决方法,再循环体内部,保留flag值
declare flag boolean;
declare falg_temp boolean;
declare continue handler for NOT FOUND set flag = false; -- 每次fetch操作,mysql都判断根据 NOT FOUND 异常,如果发送则设置为flag = false
set flag = true;
open cur;
fetch cur into userId;
while flag do
set flag_temp = flag; -- 设置flag_temp 为当前flag值
select id into accountId from t_user_account where id = userId; -- 这里如果没有取到数据,亦会报NOT FOUND 异常把 flag 设为false,导致循环提前退出
if accountId is not null then
do coding....
end if;
set flag = flag_temp; -- 还原flag值
fetch cur into userId;
select fetchOk;
end while;
分享到:
相关推荐
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名并保存,然后在需要的时候调用,极大地提高了SQL代码的重用性和执行效率。在这个实例中,我们看到一个名为`Sum_wage`的存储过程,它的...
mysql存储过程实例详解
本文实例讲述了mysql存储过程之错误处理。分享给大家供大家参考,具体如下: 当存储过程中发生错误时,重要的是适当处理它,例如:继续或退出当前代码块的执行,并发出有意义的错误消息。其中mysql提供了一种简单的...
### MySQL存储过程详解 #### 一、存储过程概述 存储过程是一种特殊类型的SQL代码集合,它们预先被编译并存储在数据库服务器上。用户可以通过指定存储过程名称并提供必要的参数来执行这些存储过程。这种机制提供了...
### MySQL存储过程实例教程 #### 存储过程概念与优势 存储过程,作为数据库中一种预编译的SQL语句集合,旨在实现特定功能并存储于数据库内,用户仅需指定其名称及必要参数即可调用执行。这种设计极大地简化了...
在这个实例详解中,我们将深入探讨这两者如何协同工作以构建一个功能完善的Web应用。 首先,让我们从`.classpath`文件开始,这是Eclipse或MyEclipse等IDE的工作空间配置文件,它包含了项目所需的库和类路径信息。在...
MySQL中的CASE语句是SQL语言中的一个重要组成部分,它在存储过程和复杂查询中扮演着条件判断的角色,使得代码更加简洁易读。CASE语句提供了两种形式:简单CASE和可搜索CASE。 1. 简单CASE语句: 简单CASE语句主要...
为了使用`mysqlhotcopy`,首先需要安装DBD-mysql Perl模块以支持该脚本与MySQL数据库的连接。然后可以通过设置Crontab任务来定期执行备份脚本,例如每天凌晨3点自动备份数据库。 ##### 3. 使用`mysqldump`备份...
Python操作MySQL数据库是一种常见的任务,特别是在开发Web应用或者需要存储和处理数据的系统中。本篇文章将详细阐述如何使用Python与MySQL进行交互,包括安装MySQL库、建立连接、数据库和表的操作以及数据的增删改查...
通过这次安装,我们不仅学会了如何安装MySQL数据库,还了解到在安装过程中如何避免常见的乱码问题。这对于Java开发者来说尤其重要,因为正确配置编码可以确保数据的正确性。此外,通过手动精确配置还可以深入了解...
### MySQL数据库设计原则详解 #### 一、引言 在当今数据驱动的世界中,数据库设计的质量直接影响着应用程序的性能和可扩展性。MySQL作为一款广泛使用的开源关系型数据库管理系统,其设计原则对于确保数据的一致性...
### 使用Navicat连接阿里云服务器上的MySQL数据库详解 #### 一、背景介绍 随着云计算技术的不断发展,越来越多的企业和个人选择将数据存储在云服务器上。阿里云作为国内领先的云计算服务提供商之一,提供了多种...
这样,Flask应用就与MySQL数据库建立了连接,并创建了一个名为`db`的SQLAlchemy实例,可以用来操作数据库。 在`app/models.py`文件中,定义数据模型。例如,我们创建`User`和`Admin`两个模型: ```python from app...
MySQL存储过程是数据库管理系统提供的一种高级程序设计语言,允许用户在数据库中封装一系列复杂的操作,以便重复使用。在MySQL 5.0及后续版本中,存储过程被引入,极大地提升了数据库管理和应用程序的效率。本教程将...
在这个实例详解中,我们将深入理解SpringMVC的核心概念以及如何与MySQL数据库进行集成。 首先,我们从SpringMVC的基本组件开始。在MVC模式中,“模型”负责处理业务逻辑和数据管理,通常由JavaBeans或实体类表示;...
MySQL存储过程是数据库中用于执行一系列SQL操作的预编译代码块,它可以提高数据库管理的效率和灵活性。在存储过程中,`IF`语句是一种常用的控制流程结构,用于根据特定条件执行不同的代码路径。本篇文章将深入探讨...
MySQL 5.0 版本中的存储过程功能极大地增强了数据库应用程序的灵活性和性能。通过对存储过程的理解和运用,开发人员可以构建出更为复杂且高效的数据库应用程序。存储过程不仅简化了代码的管理,还提升了系统的整体...
### MySQL数据库附加详解 在日常的数据库管理工作中,经常需要进行数据库的备份、恢复或迁移等操作。本文将详细介绍如何在MySQL中附加数据库,并分享一些实用的技巧。 #### 一、MySQL附加数据库概述 在MySQL中,...
"数据库课程设计详解mysql.md"文件可能包含了以下内容:课程目标、数据库设计基础、MySQL安装与配置、SQL语法详解、事务处理、索引与性能优化、视图、存储过程、触发器、备份与恢复策略、安全性管理和实际项目案例...