У меня много проблем с одной ситуацией в моей БД.
Я пытаюсь закодировать хранимую процедуру, которая вставляет запись в таблицу журнала для целей аудита после того, как 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