【问题标题】:Assigning user declared variable inside mysql while loop results in null在mysql while循环中分配用户声明的变量会导致null
【发布时间】:2021-01-25 05:03:21
【问题描述】:

我正在尝试以下 mysql 函数,其中包含一个 while 循环。

BEGIN
    SET @total := 5000;
    SET @count := 1;
    SET @total := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(items,";",1));
    INSERT INTO mytest values (SUBSTRING_INDEX(items,";",1), (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(items,";",1)));
    WHILE items != SUBSTRING_INDEX(items,";",@count) DO
    
        SET @count := @count + 1;
        SET @temp := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(SUBSTRING_INDEX(items,";",@count),";",-1));
        SET @total := @total + @temp;
        INSERT INTO mytest values (SUBSTRING_INDEX(SUBSTRING_INDEX(items,";",@count),";",-1),(SELECT price from item_prices WHERE id=SUBSTRING_INDEX(SUBSTRING_INDEX(items,";",@count),";",-1)));
    END WHILE;
    RETURN @total;
END;

我使用mytest 表来调试我的值。当我调试时,我可以看到我的SELECT 查询在所有情况下都返回了正确的值。但是,在某些情况下,我的 @total 变量会转换为 NULL。 例如:我通过字符串“1;2;14”

@total = 100
@count = 2, @temp = 200, @total = 300
@count = 3, @temp = 50, @total = NULL

Eg2:I pass String "1;14;15"
val1 = 100, @total = NULL
@count = 2, @temp = 50, @total = NULL
@count = 3, @temp = 75, @total = NULL

另外,我可以看到,@total 在某个点之后得到NULL 并保持NULL,即使对于以后对该函数的调用也是如此。有人可以在这里解释一下这个理论吗?我应该在函数末尾清除变量吗?

更新: 我的完整计划:

DROP FUNCTION IF EXISTS get_total;
CREATE FUNCTION get_total(items VARCHAR(45)) RETURNS INT DETERMINISTIC
BEGIN

    SET @total := 5000;
    SET @count := 1;
    SET @total := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(items,";",1));
    #INSERT INTO mytest values (SUBSTRING_INDEX(items,";",1), @total);
    WHILE items != SUBSTRING_INDEX(items,";",@count) DO
    
        SET @count := @count + 1;
        SET @temp := (SELECT price from item_prices WHERE id=SUBSTRING_INDEX(SUBSTRING_INDEX(items,";",@count),";",-1));
        SET @total := @total + @temp;
        #INSERT INTO mytest values (SUBSTRING_INDEX(SUBSTRING_INDEX(items,";",@count),";",-1),@total);
    END WHILE;
    RETURN @total;
END;

CREATE PROCEDURE orderPrices()
BEGIN
    SELECT id, buyer, get_total(items) AS total_price
    FROM orders
    ORDER BY id;
END;

示例输入:

orders

id  buyer           items
1   Justin Penrose  1
2   Bertha Neiman   1;2;14
3   John Doe        1;14;15

item_prices

id  price
1   100
2   200
3   500
4   250
14  50
15  75
16  100

该函数接收; 项目id 的单独列表, 我的函数尝试做的是将每个 id 与 ';' 分开,从价格表中检索相关价格并返回总价。

【问题讨论】:

  • 提供可重现您的问题的在线小提琴样本。详细解释你的函数的逻辑。
  • 使用SELECT .. INTO @variable 而不是SET @variable := (SELECT ..)。将您的函数转换为存储过程以进行调试,并在代码流期间检查错误/警告。
  • SELECT 值分配给@temp 变量没有任何问题,@total 是给我带来问题的那个,我用请求的信息更新了问题。
  • @Akina :是的,它起作用了,谢谢,你能告诉我区别吗?
  • 检查查询是否返回多行。

标签: mysql sql variables user-defined-functions user-defined


【解决方案1】:

这个任务可以通过一个简单的查询来解决:

SELECT orders.id, orders.buyer, SUM(item_prices.price) total_price
FROM orders
JOIN item_prices ON FIND_IN_SET(item_prices.id, REPLACE(orders.items, ';', ','))
GROUP BY orders.id, orders.buyer
ORDER BY id

fiddle

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2017-07-20
    • 2018-03-12
    相关资源
    最近更新 更多