Как создать динамический запрос SQL в процедуре? - MySQL
Формулировка задачи:
Объясните пожалуйста мне как создать подобный запрос? Перечитал кучу статей, везде написано по разному.
Исправьте ошибки и допишите пожалуйста как должно быть, если не сложно, а я пойму дальше:
Думаю суть ясна, что я хочу сделать с переменной 'catId'. И еще пару вопросов:
1. Верно я понимаю, что подобное возможно только в процедурах?
2. Как в процедуре вернуть ответ?
DELIMITER // CREATE PROCEDURE getRandItem (catId INT) -- RETURNS int(11) BEGIN DECLARE itemId INT(11); DECLARE @sqlstr VARCHAR(100); SET @sqlstr = 'SELECT id FROM items WHERE counter_cat_' + catId + '>0 ORDER BY RAND() LIMIT 1'; -- RETURN result; END; // DELIMITER ;
Решение задачи: «Как создать динамический запрос SQL в процедуре?»
textual
Листинг программы
-- catId - это входящий параметр SET @itemId = NULL; SET @sql_str = CONCAT('SELECT id INTO @itemId FROM items WHERE counter_cat_', catId, '>0 ORDER BY RAND() LIMIT 1 FOR UPDATE'); PREPARE sql_ FROM @sql_str; EXECUTE sql_; IF @itemId IS NULL THEN SET @itemId = 'результат не найден'; END IF; SELECT @itemId;
Объяснение кода листинга программы
SET @itemId = NULL;
— инициализирует переменную@itemId
значением NULL;SET @sql_str = CONCAT('SELECT id INTO @itemId FROM items WHERE counter_cat_', catId, '>0 ORDER BY RAND() LIMIT 1 FOR UPDATE');
— создает динамический SQL запрос, используя функцию CONCAT(), для объединения строки с именем таблицы, именем столбца и значением параметраcatId
в переменную@sql_str
;PREPARE sql_ FROM @sql_str;
— подготавливает запрос из переменной@sql_str
в объект типаPREPARE
;EXECUTE sql_;
— выполняет запрос, подготовленный в предыдущем шаге;IF @itemId IS NULL
— проверяет, является ли значение переменной@itemId
равным NULL;THEN
— если условие в предыдущем шаге истинно, переходит к следующему шагу;SET @itemId = 'результат не найден';
— устанавливает значение переменной@itemId
равным строкерезультат не найден
, если условие в предыдущем шаге истинно;END IF;
— завершает проверку условия в предыдущем шаге;SELECT @itemId;
— выбирает значение переменной@itemId
для вывода в консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д