【问题标题】:Mysql function not returning the expected resultMysql函数未返回预期结果
【发布时间】:2018-12-16 18:14:48
【问题描述】:

正如我在下面的问题标题中提到的,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');

更新:

我定义了这个函数来获取项目表的下一个可能的代码:

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

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

任何帮助都将不胜感激。

【问题讨论】:

标签: mysql mysql-function


【解决方案1】:

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

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

...检查值。 @ 前缀表示这些是用户定义的变量,因此它们具有会话作用域,而不是程序作用域,并且在函数执行后仍将保持其值。

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

但是,在那之后你还有两个问题需要解决。

SELECT ... INTO 在没有行匹配查询时设置目标变量,所以一旦你解决了你的问题,如果你传入不匹配的参数,你会得到非常错误的结果.

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

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

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

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

【讨论】:

  • 非常感谢您的建议和建议。
猜你喜欢
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多