我是靠谱客的博主 活力日记本,最近开发中收集的这篇文章主要介绍mysql游标最后一行重复的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近写存储的时候,使用游标循环插入记录时,发现最后一行重复了一次,在百度和google搜索了一下,有个回答比较靠谱,但没有说出所以然来(http://blog.sina.com.cn/s/blog_4e4a3bd10100xc9p.html ),后来又用英文单词在google上 mysql cursor  last line repeat (英文不好,请见谅)搜索了一下,stackOverFlow网站上有几个相同的问题,找了几个试了一下,发现了一个比较靠谱的,于是把它贴出来跟大家分享一下:

        question:mysql游标fetch返回两次相同的值

        描述:我得到一个存储,从一个表里面查出某些行,将其明细插入到另一张表中。我使用了游标,但是遇到了一个大问题:游标在同样的一行中循环了两次,所以我得到了两个相同的插入(记录),下面是存储的代码

IF (SELECT 1 FROM NOVEDADES  WHERE LEGAJO_ID = pLEGAJO_ID AND FECHA >= pFECHA AND CONCEPTO_ID != 11 AND CONCEPTO_ID != 13 AND CONCEPTO_ID != 12 LIMIT 1) = 1
    THEN
        BEGIN
        DECLARE vCONCEPTO_ID INT;
        DECLARE vMONTO DECIMAL(12,2);
        DECLARE vID INT;
        DECLARE vDONE INT DEFAULT 0;
        DECLARE CURSOR_NOVEDADES CURSOR FOR     
        SELECT ID        FROM NOVEDADES 
        WHERE LEGAJO_ID = pLEGAJO_ID        AND FECHA >= pFECHA        AND CONCEPTO_ID != 11 
        AND CONCEPTO_ID != 13 
        AND CONCEPTO_ID != 12;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDONE=1;
        OPEN CURSOR_NOVEDADES;
        SET vDONE = 0;
        REPEAT            FETCH CURSOR_NOVEDADES INTO vID;
            SELECT CONCEPTO_ID, MONTO INTO vCONCEPTO_ID, vMONTO            FROM NOVEDADES WHERE ID = vID;
            INSERT INTO LIQUIDACIONES_DETALLE (LIQUIDACION_ID, CONCEPTO_ID, MONTO)
            VALUES(pLIQUIDACION_ID, vCONCEPTO_ID, vMONTO);
        UNTIL vDONE END REPEAT;
        CLOSE CURSOR_NOVEDADES;
        END;
    END IF;

变量以“p”开头的是存储的“IN”参数,“v”开头的是公共变量。需要说明的是这个游标查询只会返回一个值。我也试过用Loop循环,但还是出现了同样的结果。我试着调试存储,插入相同的“SELECT”语句,看到了这个重复的结果。

        解决办法:将游标的值放到变量后,立刻检查vdone这个标识,如下:

REPEAT        
        FETCH CURSOR_NOVEDADES INTO vID;##重点
        if ! vdone then ##重点
            SELECT CONCEPTO_ID, MONTO INTO vCONCEPTO_ID, vMONTO            FROM NOVEDADES WHERE ID = vID;
            INSERT INTO LIQUIDACIONES_DETALLE (LIQUIDACION_ID, CONCEPTO_ID, MONTO)
            VALUES(pLIQUIDACION_ID, vCONCEPTO_ID, vMONTO);
       end
    UNTIL vDONE END REPEAT;

    原因:最后一次通过循环遍历的时候,“fetch”是失败的,如果这个时候继续处理,你会插入前一次的值。

英文太烂,翻译的不好, 下面是原文连接,想看原文的同学请直接点击此连接:

http://stackoverflow.com/questions/16900482/mysql-cursor-fetching-same-result-twice


转载于:https://my.oschina.net/u/1383934/blog/667444

最后

以上就是活力日记本为你收集整理的mysql游标最后一行重复的问题的全部内容,希望文章能够帮你解决mysql游标最后一行重复的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部