我正在尝试创建一个存储过程,以便在csv中生成一些报告。签名如下:
CREATE PROCEDURE testSP (IN filename VARCHAR(100),
IN study VARCHAR(100))SP基于'study‘输入参数创建带有条件WHERE子句的查询。
DECLARE studyFilter TEXT DEFAULT '';
IF (study IS NOT NULL AND study != '') THEN
SET @studyFilter = CONCAT(' AND st.goid like \'%',study,'%\' ');
END IF;如果我使用不为空的学习参数调用SP,例如
call testSP('/tmp/test.csv','study1');但是如果我用一个空的学习来调用SP,而不是有一个空的参数,SP使用最后的学习值。
例如,如果我调用,依次调用testSP('/tmp/test1.csv','study1');
call testSP('/tmp/test2.csv','');第二次,参数的值仍然是'study1‘,因此查询有一个不正确的WHERE子句。
这怎麽可能?如何才能正确地重置该参数值?我正在使用MySQL 6.1和MySQL工作台来测试SP。谢谢!
发布于 2016-10-17 11:45:56
您的@studyFilter对整个会话有效,但只有在条件为真时才会进行修改。这就是为什么如果条件为false,它将保留先前的结果。将其初始化为NULL或an empty string。
发布于 2016-10-17 11:45:40
好的,我使用的是会话变量@studyFilter,而我应该使用局部变量studyFilter
将代码更改为以下代码是有效的:
DECLARE studyFilter TEXT DEFAULT '';
IF (study IS NOT NULL AND study != '') THEN
SET studyFilter = CONCAT(' AND st.goid like \'%',study,'%\' ');
END IF;https://stackoverflow.com/questions/40085302
复制相似问题