Функция Mysql не возвращает ожидаемый результат

0

Как я уже упоминал в заголовке вопроса ниже, функция 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:

Изображение 174551

Согласно моему требованию, следующий возможный код должен быть PR000000005. Но вместо этого я всегда получаю пустой результат.

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

Любая помощь будет заметна.

  • 0
    Вы можете обратиться по ссылке: stackoverflow.com/questions/2754423/… И Синтаксис подготовленных операторов SQL: dev.mysql.com/doc/refman/8.0/en/…
  • 0
    Я не думаю, что extractnumber - это функция mysql. Вы уверены, что используете mysql?
Показать ещё 7 комментариев
Теги:

1 ответ

1
Лучший ответ

Запустите запрос, который использует эту функцию, а затем...

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.

Кроме того, ваша функция не обрабатывает параллелизм, поэтому два потока, пытающихся найти "следующее" значение для одной и той же таблицы, одновременно будут давать одинаковый ответ, поэтому вам нужно будет убедиться, что ваш код правильно справляется с уникальными ограничениями и транзакциями или других соответствующих замков.

  • 0
    Очень ценю ваши советы и пожелания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню