IN `dbid` varchar(20)BEGIN
#Routine body goes here...
DECLARE done  INT DEFAULT 0; 
DECLARE dbgid INT DEFAULT 0;
DECLARE gid   INT DEFAULT 0; # the first cate
    DECLARE mycursor1 CURSOR FOR SELECT dbcenter_goods_id,goods_id FROM qg_goods WHERE database_id=dbid;   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN mycursor1;  
    REPEAT   
    FETCH mycursor1 INTO dbgid,gid;  
if NOT done then
SET @var = 0;
set @sql=CONCAT('select goods_id into @var from `',dbid,'`.qg_goods ', ' where goods_id = ', gid);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1 ;
if(@var <> gid) THEN
DELETE FROM qg_goods WHERE dbcenter_goods_id=dbgid;
END if; DEALLOCATE PREPARE stmt1;
END if;


    UNTIL done END REPEAT;  
    CLOSE mycursor1;  红字的地方只执行了一次,请问为啥 ?要怎样才执行多次。

解决方案 »

  1.   

    把变量select出来  看看到底哪里不是你想的样子
      

  2.   

    set @sql=CONCAT('select goods_id into @var from `',dbid,'`.qg_goods ', ' where goods_id = ', gid);
    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1 ;
      

  3.   

    看看SELECT dbcenter_goods_id,goods_id FROM qg_goods WHERE database_id=dbid;  这一个sql取了多少数据到游标
      

  4.   

    问题不在那边,出在 select goods_id into @var 这个地方,可能把游标给弄没了。 不解。我用 
    set @sql=CONCAT('select goods_id from `',dbid,'`.qg_goods ', ' where goods_id = ', gid);
    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1 ;
    if FOUND_ROWS() <=0 then 
    DELETE FROM dbcenter.qg_goods WHERE dbcenter_goods_id=dbgid;
    end if;
    我用行数来判断是不是有, 其他信息不用了。 
      

  5.   

    SET @var = 0;
    set @sql=CONCAT('select goods_id into @var from `',dbid,'`.qg_goods ', ' where goods_id = ', gid);
      

  6.   

    这个地方可以把 goods_id 放到@var里面的,但会导致游标出问题,标记一下,等大侠解释。
      

  7.   

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    if NOT done then注意一下这个 done, 是系统自动控制的,在执行其它语句的时候也会导致这个 done 变量值变化。
      

  8.   

    那怎样才能防止 修改这个 done ?? 如上,我要取出  
    set @gname
    set @sql=CONCAT('select goods_id,goods_name into @gname from `',dbid,'`.qg_goods ', ' where goods_id = ', gid);这个里面的 @gname 要怎么写?? 谢谢。
      

  9.   

    DEALLOCATE PREPARE stmt1;
     END if;
    SET done = 0;
       UNTIL done END REPEAT;  
         CLOSE mycursor1;  
      

  10.   

        FETCH mycursor1 INTO dbgid,gid;   set oldDone=done;

    if NOT done then
    SET @var = 0;
    set @sql=CONCAT('select goods_id into @var from `',dbid,'`.qg_goods ', ' where goods_id = ', gid);
    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1 ;
    if(@var <> gid) THEN
    DELETE FROM qg_goods WHERE dbcenter_goods_id=dbgid;
    END if;DEALLOCATE PREPARE stmt1;
    END if;
    set done=oldDone;    UNTIL done END REPEAT;