mySQL - Использование результатов хранимых процедур для определения оператора IN

0

Я хотел бы использовать хранимую процедуру для определения предложения IN оператора select. Это (упрощенная версия), что я пытаюсь сделать:

SELECT * FROM myTable WHERE columnName IN ( CALL myStoredProc )

myStoredProc выполняет сложную логику в базе данных и возвращает список возможных совпадающих значений для columnName. Вышеприведенное утверждение не работает явно. Оператор select может быть выполнен в другой сохраненной программе, если это имеет значение.

Возможно ли это в mySQL?

Теги:
stored-procedures

1 ответ

0
Лучший ответ

Какой тип возвращаемого значения имеет текущая хранимая процедура? Вы говорите о "списке", поэтому ТЕКСТ?

Может быть, есть более простой способ, но одна вещь, которую вы можете сделать (внутри другой хранимой процедуры), - это построить еще один запрос.

Для этого нам нужно обойти два ограничения MySQL: a) Чтобы выполнить динамический SQL внутри хранимой процедуры, он должен быть подготовленным оператором. б) Подготовленные утверждения могут создаваться только из пользовательских переменных. Итак, полный SQL:

SET @the_list = myStoredProc();
SET @the_query = CONCAT('SELECT * FROM myTable WHERE columnName IN (' , @the_list , ')');
PREPARE the_statement FROM @the_query;
EXECUTE the_statement;

Если вы говорите о возврате набора результатов из хранимой процедуры, а затем используете его как таблицу, это невозможно. Вам нужно создать временную таблицу для работы это ограничение.

  • 0
    Хранимая процедура возвращает результаты, представляющие собой один столбец целых чисел. Нужно ли преобразовывать это в строку с запятой? Также я попытался реализовать ваш код (и добавил SET @the_query ...), но он думает, что myStoredProc () является функцией и выдает ошибку FUNCTION database.myStoredProc не существует. (Код ошибки 1305)
  • 0
    Также добавлено «SET». :) Да, ваша процедура должна быть функцией, которая вообще должна что-либо возвращать. Если вы все равно будете использовать временную таблицу, она, конечно, может остаться процедурой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню