【发布时间】:2015-07-06 19:20:38
【问题描述】:
为什么我的 sql 循环永远不会结束? 我做了一个简单的光标while循环,但我得到一个无限循环,我找不到错误。 我没有性能问题,它是一个无限循环,我有 35K 条记录,但循环在此之后持续很长时间,直到我停止执行并且我无法理解它是怎么回事,循环应该是光标选择检索到的确切计数
DROP PROCEDURE IF EXISTS tlaTempAmoutUSDTrades;
CREATE PROCEDURE tlaTempAmoutUSDTrades()
BEGIN
DECLARE bDone INT;
DECLARE pTradeGUID binary(16); -- or approriate type
DECLARE pTradeAmountUSD double; -- or approriate type
DECLARE curs CURSOR FOR SELECT t.guid FROM trades as t
JOIN `orderslogadd` as `o` on`t`.`orderId` = `o`.`orderId`
JOIN `currencypairs` as `ccp` on`o`.`ccpair` = `ccp`.`id`
JOIN `currencies` as `ccy1` on`ccp`.`currency1` = `ccy1`.`id`
JOIN `currencies` as `ccy2` on`ccp`.`currency2` = `ccy2`.`id`
left JOIN tlaAmountUSD tau on tau.guid = t.guid
WHERE tau.amountUSD is null ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
OPEN curs;
setAmountUSD: LOOP
FETCH curs INTO pTradeGUID;
IF (bDone = 1) OR (pTradeGUID is null) THEN
LEAVE setAmountUSD;
END IF;
SET pTradeAmountUSD = (select `crosUSDValV22`(`ccy1`.`id`,`ccy2`.`id`,`t`.`amount`,`t`.`amountCcy`,`t`.`dealtRate`,`t`.`guid`) as tradeAmountUSD
FROM `trades` as t
JOIN `orderslogadd` as `o` on`t`.`orderId` = `o`.`orderId`
JOIN `currencypairs` as `ccp` on`o`.`ccpair` = `ccp`.`id`
JOIN `currencies` as `ccy1` on`ccp`.`currency1` = `ccy1`.`id`
JOIN `currencies` as `ccy2` on`ccp`.`currency2` = `ccy2`.`id`
where t.guid=pTradeGUID);
insert into tlaAmountUSD (guid,amountUSD) values (pTradeGUID,pTradeAmountUSD);
END LOOP setAmountUSD;
关闭 curs;
结束;
【问题讨论】:
-
这是你的整个SP吗??你在哪里
END你的Begin?你的分隔符在哪里? -
How to debug small programs http://ericlippert.com/2014/03/05/how-to-debug-small-programs/。您可以采取一些简单步骤来缩小导致问题的原因。我在我的回答中提出了一些建议。我还提供了一个 SQL Fiddle 演示,以表明游标循环中没有无限循环。 SQL Fiddle here http://sqlfiddle.com/#!9/32fbb/1.