Невозможно использовать параметр хранимой процедуры в предложении WHERE - PullRequest
0 голосов
/ 06 марта 2019

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

Я пытаюсь закодировать хранимую процедуру, которая вставляет запись в таблицу журнала для целей аудита после того, как SELECTсделано в определенной таблице (идея заключается в том, что он должен работать аналогично тому, как будет работать AFTER SELECT Trigger).Хранимая процедура имеет один входной параметр - условие / предложение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...