将函数结果赋给MySql存储过程中的变量

gr8qqesn  于 2023-01-16  发布在  Mysql
关注(0)|答案(1)|浏览(170)

我正在尝试编写一个存储过程来迭代价格表和产品表。如果价格与产品表中的ID匹配,则应将生效日期早于今天的最新价格应用于产品表中的“currentPrice”列。因此,“currentPrice”列包含最新的活动价格。并且可以通过将未来日期插入到价格表中来安排价格变化。
目前我有这个:

DELIMITER $$
 create procedure updatePrice()
 begin
 declare loopLeng int default 1000;
 declare loopMax int default 1099;
 declare newPrice decimal(10,2);
 --select min(idProduct) into loopLeng from product;
--select count(idProduct) into loopMax from product;
set loopLeng  = 1000;
set loopMax = 1099;
 updateLoop : LOOP
    if loopLeng > loopMax  then 
    leave updateLoop;
    end if;
    select price into newPrice from price where idProduct = loopLeng and dateApplicableFrom = (select max(dateApplicableFrom) from price where idProduct = loopLeng and dateApplicableFrom <= current_timestamp());
    update product set currentPrice = newPrice where idProduct = loopLeng;
    set loopLeng = loopLeng + 1; 
    end loop;
    end
    $$ DELIMITER ;

这可以正常工作...但显然包含loopLeng和loopMax的硬编码值(定义product上循环的大小),所以如果产品数量发生变化,它就不灵活了。我想根据idProduct和count的实际最小值动态设置这些值,就像在注解行7和8中那样。这看起来应该对我有效,不会给予任何错误,但是每当我使用这些定义执行过程时,它都无法执行必要的更新。
我也试过创建临时变量,选择函数结果到那些变量中,然后把 those 赋值给loopLeng和loopMax,但是结果是一样的,到目前为止我只能用硬编码的值来执行,谁能告诉我哪里出错了吗?

luaexgnf

luaexgnf1#

尝试使用预准备语句,如下所示:

set @sql = 'select count(idProduct) into loopMax from product';
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

set @sql = 'select count(idProduct) into loopMax from product;';
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

相关问题