【问题标题】:MariaDB cursor loop issueMariaDB 游标循环问题
【发布时间】:2016-11-15 00:47:04
【问题描述】:

我的光标正在处理第一条记录并出来。它不会进入第二个记录。可能是什么问题?以下是我的代码:

有超过 600,000 行需要处理。当我执行选择查询时,它会显示正确的行数,但循环不起作用。

Delimiter $$
CREATE PROCEDURE  p_updateHistory_1()
BEGIN
DECLARE v_symbol varchar(10);
DECLARE v_pricedate date;

DECLARE done BOOL DEFAULT FALSE;
DECLARE cur1 CURSOR FOR SELECT symbol, PriceDate 
           from StockData
           where PriceDate > '2016-06-30'
           order by symbol asc, PriceDate desc;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur1;

read_loop: LOOP
FETCH cur1 INTO v_symbol, v_pricedate;

If done THEN
    LEAVE read_loop;
END IF;

Update StockData SET
20DayTPAvg = f_TP20avg(symbol,PriceDate),
20DayMFSum = f_20DayMFSum(symbol,PriceDate),
20DayVolumeSum = f_20DayVolumeSum(symbol,PriceDate),
MFFactor = f_20DayMFSum(symbol,PriceDate)/f_20DayVolumeSum(symbol,PriceDate),
50DayHighestHigh = f_50DayHighestHigh(symbol,PriceDate),
50DayLowestLow = f_50DayLowestLow(symbol,PriceDate),
50DayFactor = ((close-f_50DayLowestLow(symbol,PriceDate))/(f_50DayHighestHigh(symbol,PriceDate)-f_50DayLowestLow(symbol,PriceDate)))*100,
20DayAvgOf50DayFactor = f_20DayAvgOf50DayFactor(symbol,PriceDate),
50DayMAvg20DayBfr = f_20DayMAvg20DayBfr(symbol,PriceDate),
20DayAvgSqCh50DMA = f_20DayAvgSqCh50DMA(symbol,PriceDate),
20dStdDevOf50DayMovAvg = SQRT(f_20DayAvgSqCh50DMA(symbol,PriceDate)),
UpperBand =  50DayMovingAvg+2*SQRT(f_20DayAvgSqCh50DMA(symbol,PriceDate)), 
LowerBand = 50DayMovingAvg-2*SQRT(f_20DayAvgSqCh50DMA(symbol,PriceDate)),
MidPointFactor = ((close-MidPoint)/(high-close))*100,
20DayAvgOfMPFactor = f_20DayAvgOfMPFactor(symbol,PriceDate)
Where symbol=v_symbol
And PriceDate=v_pricedate;

commit;

END LOOP;

CLOSE Cur1;

END $$
Delimiter ;

【问题讨论】:

  • 如果我在这里做错了什么,有什么建议吗?

标签: mysql loops cursor mariadb


【解决方案1】:

我遇到了同样的问题。 根据 MariaDB 文档,如果任何 select 语句没有返回数据,它将被视为“未找到”并且根据处理程序 Done 变为 true,因此停止获取游标。 似乎您正在使用许多功能。请检查是否有任何函数返回空结果。

【讨论】:

    【解决方案2】:

    CURSORs 通常是一个错误。你不能简单地做这个一个语句,没有光标吗?

    UPDATE StockData
        SET ...
        WHERE PriceDate > '2016-06-30';
    

    f_20DayAvgOf50DayFactor(等)是 UDF 还是存储函数?

    需要复合索引

    INDEX(symbol, PriceDate)
    

    【讨论】:

    • 虽然这个答案可能是另一种方法,但它甚至不是这个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多