Как создать динамический запрос 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для вывода в консоль.