5
回答
急,请教Mysql存储过程退出循环的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

编写一个MySQL的存储过程:循环入库单并逐条取出货品ID,根据货品ID分别去查询对应的出库和报账情况。算法如下:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

declare 入库单货品游标;

open 游标;

fetch 一条货品ID

        ①根据货品ID,获取对应的出库记录;(select into 临时变量)

        ②根据货品ID,获取对应的报账记录;

close 游标;

存在一个问题:如果其中某个货品ID没有对应的出库记录或报账记录,就会触发not found,并退出游标。但实际是,即便该货品ID没有对应的记录,希望还是继续遍历全部的货品。

如何解决当语句①②为空时,不触发done=1并退出游标这个问题?

举报
xmut
发帖于6年前 5回/2K+阅
共有5个答案 最后回答: 6年前

伪码:

OPEN cursor1;

REPEAT
  FETCH cursor1 INTO f1, f2, f3, f4;
  IF NOT done THEN
	①根据货品ID,获取对应的出库记录;(select into 临时变量)
	②根据货品ID,获取对应的报账记录;
	IF NOT 出库记录 AND NOT 报账记录 THEN
		SET done = TRUE;
	ELSE
		-- 执行相应处理
	END IF;
  END IF;
 UNTIL done END REPEAT;
--- 共有 1 条评论 ---
xmut我发现如果查询结果为空,而仍然使用select into语句,则会触发not found。莫非我每次都要使用select count(*)来判断记录是否为空,再使用select into赋值?能否有更优雅的解决方法? 6年前 回复

如果查询的结果是数值的话可以用例如下面的语句:

SELECT COALESCE(SUM(view_count),0) INTO @RVS FROM xxxx WHERE .....

--- 共有 1 条评论 ---
xmut有没有可以调试存储过程的MySQL工具? 6年前 回复

现在为了解决语句①②不抛出not found异常,改成这样:

select count(*) 
  into _count
  from 表A 
 where 条件A;
if _count then
  select sum(*) 
    into 变量A
    from 表A
   where 条件A; -- 这边又重复上面的条件,而且条件很长
end if;  

感觉这样写,很多代码都是重复累赘,能否有其他方法解决?

 

顶部