gpt4 book ai didi

Mysql 函数未返回预期结果

转载 作者:行者123 更新时间:2023-11-29 10:09:35 25 4
gpt4 key购买 nike

正如我在下面的问题标题中提到的,Mysql 函数始终返回 null :

CREATE DEFINER=`root`@`localhost` FUNCTION `nextCode`(tbl_name VARCHAR(30), prv_code VARCHAR(30)) RETURNS varchar(30) CHARSET utf8
READS SQL DATA
BEGIN

DECLARE nxtCode VARCHAR(30);

SELECT ds.prefix, ds.suffix, ds.is_used, ds.next_number, CHAR_LENGTH(ds.pattern)
INTO @prefix, @suffix, @isUsed, @nxtNum, @pLength
FROM ths_inventory.doc_sequnce ds WHERE ds.`table_name` = tbl_name;

SET nxtCode = CONCAT(@prefix, LPAD((CASE WHEN @isUsed
THEN
(ExtractNumber(prv_code) + 1)
ELSE
(@nxtNum)
END
), @pLength,'0'), @suffix);

RETURN nxtCode;

END

但是一旦我更改了以下行:

CONCAT(@prefix, LPAD((CASE WHEN @isUsed 
THEN
(ExtractNumber(prv_code) + 1)
ELSE
(@nxtNum)
END
), @pLength,'0'), @suffix)

对于一些静态值,如下所示:

CONCAT('PR', LPAD((CASE WHEN true 
THEN
(ExtractNumber(prv_code) + 1)
ELSE
(5)
END
), 6,'0'), '')

函数开始相应地返回值。

这是我如何调用我的函数:

nextCode('item','PR000002');

更新:

我定义此函数是为了获取 Item 表的下一个可能的代码:

enter image description here

根据我的要求,下一个可能的代码应该是PR000000005。但我总是得到空结果,而不是得到它。

SELECT nextCode('item',(SELECT `code` FROM item ORDER BY id DESC LIMIT 1)) AS next_code;

任何帮助将不胜感激。

最佳答案

运行使用该函数的查询,然后...

SELECT @prefix, @suffix, @isUsed, @nxtNum, @pLength;

...检查值。 @ 前缀意味着这些是用户定义的变量,因此它们具有 session 作用域,而不是程序作用域,并且在函数执行后仍将保留它们的值。

这应该有助于查明您的问题。

但是,此后您还有另外两个问题需要解决。

SELECT ... INTO 不会在没有行与查询匹配时设置目标变量,因此一旦解决问题,如果您传入与任何内容都不匹配的参数。

要解决此问题,函数需要在 SELECT ... INTO 查询之前将所有这些变量设置为 null。

SET @prefix = NULL, @suffix = NULL, @isUsed = NULL, @nxtNum = NULL, @pLength = NULL;

参见https://dba.stackexchange.com/a/35207/11651 .

此外,您的函数不处理并发性,因此两个线程同时尝试查找同一个表的“下一个”值将产生相同的答案,因此您需要确保您的代码使用唯一的方法正确处理此问题约束和事务或其他适当的锁。

关于Mysql 函数未返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51239153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com