Как я уже упоминал в заголовке вопроса ниже, функция 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:
Согласно моему требованию, следующий возможный код должен быть PR000000005
. Но вместо этого я всегда получаю пустой результат.
SELECT nextCode('item',(SELECT 'code' FROM item ORDER BY id DESC LIMIT 1)) AS next_code;
Любая помощь будет заметна.
Запустите запрос, который использует эту функцию, а затем...
SELECT @prefix, @suffix, @isUsed, @nxtNum, @pLength;
... для проверки значений. Префикс @
означает, что это переменные, определяемые пользователем, поэтому они имеют область сеанса, а не область программы, и будут по-прежнему удерживать свои значения после выполнения funcfion.
Это должно помочь определить вашу проблему.
Но у вас есть еще две проблемы, которые вам нужно будет решить после этого.
SELECT... INTO
не устанавливает целевые переменные, когда ни одна строка не соответствует запросу, поэтому, как только вы исправите проблему, вы получите очень неправильные результаты, если вы передадите аргументы, которые не соответствуют чему-либо.
Чтобы решить эту проблему, функция должна установить для всех этих переменных значение null перед запросом SELECT... INTO
.
SET @prefix = NULL, @suffix = NULL, @isUsed = NULL, @nxtNum = NULL, @pLength = NULL;
См. Https://dba.stackexchange.com/a/35207/11651.
Кроме того, ваша функция не обрабатывает параллелизм, поэтому два потока, пытающихся найти "следующее" значение для одной и той же таблицы, одновременно будут давать одинаковый ответ, поэтому вам нужно будет убедиться, что ваш код правильно справляется с уникальными ограничениями и транзакциями или других соответствующих замков.