#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 для сборки фактического запроса со вставкой во временную таблицу; и использование курсора для перебора по этой временной таблице.