【发布时间】:2023-04-04 03:31:01
【问题描述】:
我想在游标内运行一个循环,通过反向递增其中一个值来确定计算值,直到满足计算值开始比前一个值减小的条件。 这是查询所基于的数据集: table
光标不返回输出,而是进入无限循环。 我做错了什么?
版本详情: 服务器版本:10.4.20-MariaDB - mariadb.org 二进制分发 协议版本:10
样本数据:
CREATE TABLE `py_price` (
`ean_id` int(11) NOT NULL,
`min_price` float NOT NULL DEFAULT 0,
`med_price` float NOT NULL DEFAULT 0,
`max_price` float NOT NULL DEFAULT 0,
`min_vol` float NOT NULL DEFAULT 0,
`med_vol` float NOT NULL DEFAULT 0,
`max_vol` float NOT NULL DEFAULT 0,
`a_val` float NOT NULL DEFAULT 0,
`b_val` float NOT NULL DEFAULT 0,
`c_val` float NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `py_price` (`ean_id`, `min_price`, `med_price`, `max_price`, `min_vol`, `med_vol`, `max_vol`, `a_val`, `b_val`, `c_val`) VALUES
(1, 45, 65, 80, 350, 276, 200, -0.0390476, 0.595238, 402.286),
(2, 145, 256, 300, 1344, 1000, 780, -0.0122639, 1.81872, 1338.13),
(3, 245, 255, 265, 2500, 2100, 1800, 0.5, -290, 43537.5)
第一个记录的计算模拟: 使用二次方程:a_val * decremented(min_price) * decremented(min_price)+ b_val * decremented(min_price) + c_val
| min_price | result |
|---|---|
| 45 | 350 |
| 44 | 352.88 |
| 7 | 404.54 |
| 6 | 404.45 |
min val 下降超过 7 结果开始比前一个下降,目的是确定这个水平,即:在这个例子中 min_price = 7
CREATE PROCEDURE p1()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE sk INT;
declare min_price,min_vol,a,b,c float;
DECLARE cur CURSOR FOR SELECT ean_id,min_price,min_vol,a_val,b_val,c_val FROM rfc_build.py_price;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO sk,min_price,min_vol,a,b,c;
IF done THEN
LEAVE read_loop;
END IF;
set @mp=min_price;
set @new_vol_orig=min_vol;
in_loop: loop
set @new_vol=a*@mp*@mp+b*@mp+c;
if @new_vol<@new_vol_orig then
insert into py_range values(sk,@mp);
leave in_loop;
end if;
set @mp=@mp-1;
end loop;
END LOOP;
CLOSE cur;
END;
//
DELIMITER ;
【问题讨论】:
-
请以 CREATE TABLE + INSERt 的形式提供示例数据,而不是图片。并通过详细解释显示此数据的预期结果。
-
感谢您的回复,我已对我的原始评论进行了更详细的编辑。
标签: mysql loops mariadb cursor handler