mysql 游标最后一行 重复问题

BEGIN
declare p_id INT;
declare p_Code INT default 0;
declare p_Logo
INT default 0;
declare p_Name varchar(255) default ‘‘;
declare p_Address
varchar(755) default ‘‘;
declare p_Phone varchar(755) default ‘‘;
declare
p_Logo2 varchar(755) default ‘‘;
declare p_Logo3 varchar(755) default
‘‘;
declare p_Paid varchar(755) default ‘‘;
declare p_IsDelete
varchar(755) default ‘‘;
declare done INT DEFAULT 0;
declare cur CURSOR
FOR SELECT ID, Code,Logo,Name,Address,Phone,Logo2,Logo3,Paid,IsDelete  FROM
hospital_copy;
declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN
cur;
REPEAT
FETCH cur INTO p_id,
p_Code,p_Logo,p_Name,p_Address,p_Phone,p_Logo2,p_Logo3,p_Paid,p_IsDelete;
IF done=0 THEN
INSERT INTO
`hospital` (
`ID` ,
`Code` ,
`Name` ,
`Country_Code` ,
`Phone`
,
`Address1` ,
`Address2`
,
`Address3` ,
`County`
,
`Country` ,
`Postcode`
,
`Logo`
,
`Logo2` ,
`Logo3`
,
`Paid`
,
`IsDeleted`,
`Add_time`,
`Delete_time`,
`timeInterval`
)
VALUES (
p_id,
p_Code,p_Name,‘0001‘,‘13971056776‘,p_Address,p_Address, p_Address, p_Address,
p_Address, ‘442200‘,
p_Logo,p_Logo2,p_Logo3,p_Paid,p_IsDelete,‘2011-1-1‘,‘‘,‘30‘);
END IF;
UNTIL
done=1
END REPEAT;
CLOSE
cur;
END

加深红色部分解决方法,最后的重复的原因是FETCH cur INTO
……;的时候,当第一次到达最后一条记录时,取出记录,把值给变量,这时一切正常,没有错误。然后UNTIL UNTIL done=1
循环到REPEAT重新开始,再FETCH一条时,已经没有记录,done会被 SET
done=1;,但此刻没有进行任何判断,程序会继续执行INSERT INTO
……语句,而由于FETCH没有取到记录,则没有对变量进行赋值,所以变量仍是原值。当到UNTIL done 时程序退出REPEAT,从而最后的记录会被重复。

时间: 2024-10-25 12:05:59

mysql 游标最后一行 重复问题的相关文章

plsql游标最后一行重复的问题

大家仔细看一下,下面第一个存储过程,test01,有没问题? 看似没问题,其实会造成重复行,test02将exit when的语句放到合适的位置上来.就不会出现最后一行重复打印的问题. create or replace procedure test01 as cursor cursor1 is select * from v$session where rownum <= 5; record1 cursor1%rowtype; begin DBMS_OUTPUT.ENABLE(buffer_s

MySQL游标的简单实践

Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行,简单的select语句成批地进行处理,需要在检索出来的行中前进或后退一行或多行--若是想得到其中的每一行进行处理,就必须使用游标. Q:什么是游标? A: 游标(cursor),是一个存储在MySQL服务器上的数据库查询,游标不是一条 SELECT语句,而是被该语句检索出来的结果集:可以看做是指向

SqlServer和MySQL游标学习

一 sqlserver游标使用 /*** 游标的使用  讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱.  使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1声明游标 最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>: 其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询 例子: [已表2 AddSalary为例子] Declare mycursor cursor for select *

MySQL 游标管理

在理解了Oracle上的游标之后,再去翻MySQL中关于游标的说明,发现这块讲得比较简单,用一个例子来说明就能理解MySQL游标的使用方法. 游标的使用分为4步:分别是打开游标(open).游标循环(loop,leave).提取数据(fetch).关闭游标(close). 这里使用了Mysql官方文档(5.5)中的例子: CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a CHAR(16); DEC

MySQL 删除数据库中重复数据(以部分数据为准)

delete from zqzrdp where tel  in (select min(dpxx_id) from  zqzrdp  group by tel  having count(tel)>1); 执行,报错 异常意为:你不能指定目标表的更新在FROM子句.傻了,MySQL 这样写,不行,让人郁闷. 难倒只能分步操作,蛋疼 以下是网友写的,同样是坑爹的代码,我机器上运行不了. 1. 查询需要删除的记录,会保留一条记录.  代码如下 复制代码 select a.id,a.subject,

MySQL游标的使用

MySQL游标的使用 A simple cursor of mysql step1: 新建表tb_test; create table tb_test( id int ); insert into tb_test values ('1'); insert into tb_test values ('2'); insert into tb_test values ('3'); step2: 声明存储过程sp_test; delimiter $$ create procedure sp_test()

使用mysql 游标,快速删除子节点及其附属节点

上篇,我写的是如何用数据存储,并通过html展示出树形的结构, 本篇我将讲述,如何通过存储过程,删除一个树节点及其附属节点.网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写这篇文章呢,主要是想表达一些在软件设计领域的一些想法. 我不赞同在数据库中大量的使用存储过程, 因为我觉得随着软件系统的复杂度逐渐提高,维护的难度会逐渐的增大.而且大批量的使用存储过程,不利于后期通过分布式部署应用程序来解决日益增多的业务需求. 我推荐把存储过程用在处理一些不包含太多业务,批量操作数据的场景

[转]MySQL游标的使用

转自:http://www.cnblogs.com/sk-net/archive/2011/09/07/2170224.html 以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助. 1. 无返回结果语句,如:INSERT,UPDATE,DROP, DELETE等 2. select语句返回单行变量并可传给本地变量(select ..into) 3. 返回

MySQL游标操作指南

本篇文章是对MySQL游标的具体使用进行了详细的分析介绍,需要的朋友参考下 测试表 level  代码如下: create table test.level (name varchar(20)); 再 insert 些数据 ; 初始化 代码如下: drop procedure if exists useCursor // 建立 存储过程 create 代码如下: CREATE PROCEDURE useCursor() BEGIN 局部变量的定义 declare 代码如下: declare tm