Процедура SQL, которая по какой-то причине не работаетMySql

Форум по Mysql
Ответить
Anonymous
 Процедура SQL, которая по какой-то причине не работает

Сообщение Anonymous »

Я пытаюсь написать простую процедуру на основе системы баз данных MySQL, которая принимает одну строку в качестве параметра. Затем процедура разбивает ее на более короткие строки (с использованием разделителя), так что каждая строка представляет собой число больше 0. В противном случае подстрока отбрасывается, если она вообще не является числом. Результат должен быть возвращен в виде таблицы с одним столбцом. К сожалению, по неизвестной причине я не получаю желаемых результатов. Может ли кто-нибудь взглянуть на код и помочь мне исправить ошибку?
Процедура и функция (не требует таблицы базы данных):

Код: Выделить всё

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(
IN variants VARCHAR(50)
)
BEGIN
DECLARE counter INT DEFAULT 0;
SET
@validated_params = FALSE,
@params_number = (CHAR_LENGTH(variants) - CHAR_LENGTH(REPLACE(variants, ';', '')) + 1
);
SET
@correct_params = JSON_ARRAY('[3, 1]');
WHILE counter < @params_number DO
SET
counter = counter + 1;
SET
@variant = split_string(@variants, ';', counter);
IF @variant > 0 THEN
SET
@correct_params = JSON_ARRAY_APPEND(@correct_params, '$', @variant);
END IF;
END WHILE;
IF JSON_LENGTH(@correct_params) = @params_number THEN
SET
@validated_params = TRUE;
END IF;
SELECT variant_number FROM JSON_TABLE(@correct_params, '$[*]' COLUMNS (variant_number INT PATH '$')) AS variant_number;
END

Код: Выделить всё

CREATE DEFINER=`root`@`localhost` FUNCTION `split_string`(
string_to_split VARCHAR(250),
delimimiter VARCHAR(5),
position INT
) RETURNS int
DETERMINISTIC
BEGIN
SET
@splitted_string = REPLACE(
SUBSTRING(
SUBSTRING_INDEX(string_to_split, delimimiter, position),
CHAR_LENGTH(SUBSTRING_INDEX(string_to_split, delimimiter, position - 1)) + 1
), delimimiter, ''
);
SET
@splitted_number = (
CASE WHEN @splitted_string REGEXP '^[0-9]+$' THEN
CAST(@splitted_string AS UNSIGNED) ELSE -1 END
);
RETURN @splitted_number;
END
После запуска процедуры со следующими параметрами примера мы должны получить таблицу вида:

Код: Выделить всё

CALL new_procedure('2, b7, vb, 9');


variant_number




3


1


2


9



Однако я получаю пустую таблицу...

Подробнее здесь: https://stackoverflow.com/questions/799 ... ome-reason
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»