【发布时间】: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