代码之家  ›  专栏  ›  技术社区  ›  Aditya Dwivedi

这个mysql游标有什么问题,如何更正?

  •  0
  • Aditya Dwivedi  · 技术社区  · 6 年前
    CREATE PROCEDURE curLike()
        BEGIN
            DECLARE likeRec likecounttable;
            DECLARE c_likeCount CURSOR FOR SELECT l.likeCount, l.qId  FROM likecounttable l;
    
            OPEN c_likeCount;
            start_loop:LOOP
                FETCH c_likeCount IN likeRec
                UPDATE qentry SET qentry.likeCount = likeRec.likeCount WHERE qentry.qId=likeRec.qId;
            END LOOP;
            CLOSE c_likeCount;
        END;
    

    我试图在这里使用一个游标从LikeCountable中获取记录,我在一些网站上看到了这种语法,所以我使用了它,但它不起作用

    2 回复  |  直到 6 年前
        1
  •  1
  •   Napoli    6 年前

    您在第一次声明后缺少分号, likecounttable 是表,而不是数据类型。

    由于您试图将两列值存储到声明的变量中,因此第一行应该更像这样

    DECLARE likeRec_Count, likeRec_qId INT;
    

    阅读完代码后,如果不向游标中添加,可以使用以下sql来简化,这与游标的作用相同。

    UPDATE qentry JOIN likecounttable l ON l.qId=qentry.qId
      SET qentry.likeCount = l.likeCount
    ;
    

    编辑: 如果您想对光标进行完全更新,下面的操作也应该这样做。

    DELIMITER $$
    CREATE PROCEDURE curLike()
        BEGIN
            DECLARE c_likeRec_isdone BOOLEAN DEFAULT FALSE;
            DECLARE likeRec_Count, likeRec_qId INT;
            DECLARE c_likeCount CURSOR FOR SELECT l.likeCount, l.qId  FROM likecounttable l;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET c_likeRec_isdone = TRUE;
    
            OPEN c_likeCount;
            loop_likeRecList: LOOP
    
               FETCH c_likeCount INTO likeRec_Count, likeRec_qId;
               IF c_likeRec_isdone THEN
                  SET c_likeRec_isdone = FALSE;
                  LEAVE loop_likeRecList;
               END IF;
    
               UPDATE qentry SET qentry.likeCount = likeRec_Count WHERE qentry.qId=likeRec_qId;
    
            END LOOP loop_likeRecList;
            CLOSE c_likeCount;
        END;
    $$    
    
        2
  •  0
  •   Kedar Limaye    6 年前
    CREATE PROCEDURE curLike()
        BEGIN
            DECLARE likeRec_Count, likeRec_qId INT;
            DECLARE c_likeCount CURSOR FOR SELECT l.likeCount, l.qId  FROM likecounttable l;
    
            OPEN c_likeCount;
            start_loop:LOOP
                FETCH c_likeCount INTO likeRec_Count,likeRec_qId 
                UPDATE qentry SET qentry.likeCount = likeRec_Count WHERE qentry.qId=likeRec_qId ;
            END LOOP;
            CLOSE c_likeCount;
        END;