首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL存储过程覆盖空参数

问MySQL存储过程覆盖空参数
EN

Stack Overflow用户
提问于 2016-10-17 11:33:08
回答 2查看 1.5K关注 0票数 1

我正在尝试创建一个存储过程,以便在csv中生成一些报告。签名如下:

代码语言:javascript
复制
CREATE PROCEDURE testSP (IN filename VARCHAR(100),
             IN study VARCHAR(100))

SP基于'study‘输入参数创建带有条件WHERE子句的查询。

代码语言:javascript
复制
DECLARE studyFilter TEXT DEFAULT '';

  IF (study IS NOT NULL AND study != '') THEN
    SET @studyFilter = CONCAT(' AND st.goid like \'%',study,'%\' ');
  END IF;

如果我使用不为空的学习参数调用SP,例如

代码语言:javascript
复制
call testSP('/tmp/test.csv','study1');

但是如果我用一个空的学习来调用SP,而不是有一个空的参数,SP使用最后的学习值。

例如,如果我调用,依次调用testSP('/tmp/test1.csv','study1');

代码语言:javascript
复制
call testSP('/tmp/test2.csv','');

第二次,参数的值仍然是'study1‘,因此查询有一个不正确的WHERE子句。

这怎麽可能?如何才能正确地重置该参数值?我正在使用MySQL 6.1和MySQL工作台来测试SP。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-17 11:45:56

您的@studyFilter对整个会话有效,但只有在条件为真时才会进行修改。这就是为什么如果条件为false,它将保留先前的结果。将其初始化为NULL或an empty string。

票数 1
EN

Stack Overflow用户

发布于 2016-10-17 11:45:40

好的,我使用的是会话变量@studyFilter,而我应该使用局部变量studyFilter

将代码更改为以下代码是有效的:

代码语言:javascript
复制
DECLARE studyFilter TEXT DEFAULT '';    
IF (study IS NOT NULL AND study != '') THEN
   SET studyFilter = CONCAT(' AND st.goid like \'%',study,'%\' ');
END IF;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40085302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档