Не может использовать параметр хранимой процедуры в предложении WHERE

#mysql #sql #stored-procedures

#mysql #sql #хранимые процедуры

Вопрос:

У меня много проблем с одной ситуацией в моей БД.

Я пытаюсь закодировать хранимую процедуру, которая вставляет запись в таблицу журнала в целях аудита после того, как SELECT выполняется в определенной таблице (идея в том, что она должна работать аналогично тому, как будет работать AFTER SELECT триггер). Хранимая процедура имеет один входной параметр, условие / предложение WHERE.

Пользователь выполняет SP и записывает условие (например, IDCultura=1). SP использует этот параметр для создания SELECT инструкции, подобной этой: SELECT * FROM dba.medicoes WHERE *IDCultura=1*

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

Я не могу использовать параметр в качестве WHERE предложения, но если я вручную напишу тот же текст в предложении, это сработает.

Я видел некоторые решения, которые используют CONCAT для объединения всех частей запроса перед выполнением. Но поскольку я использую SELECT запрос при объявлении курсора, я не могу SET использовать переменную раньше.

Вот код, с которым я работаю прямо сейчас:

 CREATE DEFINER=`root`@`localhost` PROCEDURE `select_medicoes`(
    whereCondicao varchar(200))

BEGIN
DECLARE ID_novo int;
DECLARE ID_Variavel int;
DECLARE ID_Cultura int;
DECLARE NumMed int;
DECLARE DataHoraMed date;
DECLARE ValorMed int;
DECLARE done INT DEFAULT FALSE;

DECLARE curs_medicoeslog cursor for 
    (SELECT *
    FROM `dba`.medicoes
    WHERE `whereCondicao`);

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SELECT `whereCondicao`;

OPEN curs_medicoeslog;
    read_loop: LOOP
        FETCH curs_medicoeslog INTO ID_Variavel, ID_Cultura, NumMed, DataHoraMed, ValorMed;
            INSERT INTO log_medicoes (IDVariavel, IDCultura, NumMedicao, DataHoraMedicao, ValorMedicao, Utilizador, `Data`, Operacao) 
            VALUES (ID_Variavel, ID_Cultura, NumMed, DataHoraMed, ValorMed, current_user(), now(), 'S');
        IF done THEN
            LEAVE read_loop;
        END IF;
    END LOOP;
CLOSE curs_medicoeslog;
END
  

Комментарии:

1. Удален тег sql server, поскольку это явно mysql.

2. Извините за ошибку. И спасибо вам за редактирование!

3. Пожалуйста. Я хотел бы помочь вам с ответом, но я даже не могу правильно написать mysql. 🙂

4. Прошло некоторое время с тех пор, как я делал что-то подобное; но, кажется, я припоминаю использование dynamic sql для сборки фактического запроса со вставкой во временную таблицу; и использование курсора для перебора по этой временной таблице.