Как создать динамический запрос SQL в процедуре? - MySQL

Узнай цену своей работы

Формулировка задачи:

Объясните пожалуйста мне как создать подобный запрос? Перечитал кучу статей, везде написано по разному. Исправьте ошибки и допишите пожалуйста как должно быть, если не сложно, а я пойму дальше:
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 ;
Думаю суть ясна, что я хочу сделать с переменной 'catId'. И еще пару вопросов: 1. Верно я понимаю, что подобное возможно только в процедурах? 2. Как в процедуре вернуть ответ?

Решение задачи: «Как создать динамический запрос 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;

Объяснение кода листинга программы

  1. SET @itemId = NULL; — инициализирует переменную @itemId значением NULL;
  2. 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;
  3. PREPARE sql_ FROM @sql_str; — подготавливает запрос из переменной @sql_str в объект типа PREPARE;
  4. EXECUTE sql_; — выполняет запрос, подготовленный в предыдущем шаге;
  5. IF @itemId IS NULL — проверяет, является ли значение переменной @itemId равным NULL;
  6. THEN — если условие в предыдущем шаге истинно, переходит к следующему шагу;
  7. SET @itemId = 'результат не найден'; — устанавливает значение переменной @itemId равным строке результат не найден, если условие в предыдущем шаге истинно;
  8. END IF; — завершает проверку условия в предыдущем шаге;
  9. SELECT @itemId; — выбирает значение переменной @itemId для вывода в консоль.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5