【问题标题】:MySQL mariadb Loop in cursor issue游标问题中的 MySQL mariadb Loop
【发布时间】: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


【解决方案1】:

请检查ean_id = 1 的模拟是否正确:

https://dbfiddle.uk/?rdbms=mariadb_10.4&fiddle=1fb90d363fe77bb653967bfaa0edf0d6

WITH RECURSIVE
cte AS ( SELECT ean_id, 
                min_price,
                min_vol,
                `a_val`, `b_val`, `c_val`,
                a_val * min_price * min_price + b_val * min_price + c_val new_vol,
                0 prev_new_vol
         FROM py_price
         WHERE ean_id = 1 
       UNION ALL
         SELECT ean_id, 
                min_price - 1,
                min_vol,
                `a_val`, `b_val`, `c_val`,
                a_val * (min_price-1) * (min_price-1) + b_val * (min_price-1) + c_val,
                new_vol
         FROM cte
         WHERE min_price > 0
           AND new_vol < a_val * (min_price-1) * (min_price-1) + b_val * (min_price-1) + c_val )
SELECT * 
FROM cte
ORDER BY min_price 
LIMIT 1;

【讨论】:

  • 哇!!.. 这对我来说是新知识,我可以在许多其他情况下使用它...非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2015-10-11
相关资源
最近更新 更多