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

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

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

Объясните пожалуйста мне как создать подобный запрос? Перечитал кучу статей, везде написано по разному. Исправьте ошибки и допишите пожалуйста как должно быть, если не сложно, а я пойму дальше:
Листинг программы
  1. DELIMITER //
  2. CREATE PROCEDURE getRandItem (catId INT)
  3. -- RETURNS int(11)
  4. BEGIN
  5.  
  6. DECLARE itemId INT(11);
  7. DECLARE @sqlstr VARCHAR(100);
  8. SET @sqlstr = 'SELECT id FROM items WHERE counter_cat_' + catId + '>0 ORDER BY RAND() LIMIT 1';
  9. -- RETURN result;
  10.  
  11. END; //
  12. DELIMITER ;
Думаю суть ясна, что я хочу сделать с переменной 'catId'. И еще пару вопросов: 1. Верно я понимаю, что подобное возможно только в процедурах? 2. Как в процедуре вернуть ответ?

Решение задачи: «Как создать динамический запрос SQL в процедуре?»

textual
Листинг программы
  1. -- catId - это входящий параметр
  2.  
  3. SET @itemId = NULL;
  4.  
  5. SET @sql_str = CONCAT('SELECT id INTO @itemId FROM items WHERE counter_cat_', catId, '>0 ORDER BY RAND() LIMIT 1 FOR UPDATE');
  6. PREPARE sql_ FROM @sql_str;
  7. EXECUTE sql_;
  8.  
  9. IF @itemId IS NULL
  10.     THEN
  11.     SET @itemId = 'результат не найден';
  12. END IF;
  13.    
  14. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут