首页 > 解决方案 > 不能在 WHERE 子句中使用存储过程参数

问题描述

我的数据库中的一种情况遇到了很多麻烦。

我正在尝试编写一个存储过程,该过程在特定表中完成后将条目插入日志表以进行审计SELECT(想法是它的工作方式应该类似于AFTER SELECT触发器的工作方式)。存储过程有一个输入参数,即 WHERE 条件/子句。

用户执行 SP 并写入条件(例如IDCultura=1)。SP 使用该参数进行SELECT如下声明:SELECT * FROM dba.medicoes WHERE *IDCultura=1*

当我尝试创建一个循环该查询结果的游标时,我的问题就出现了,因此它在日志表中为SELECT.

我不能将参数用作WHERE子句,但是如果我在子句中手动编写相同的文本,它就可以工作。

我已经看到一些解决方案CONCAT在执行之前使用 a 来连接查询的所有部分。但是因为我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

标签: mysqlsqlstored-procedures

解决方案


推荐阅读