MySQL存储过程会覆盖空参数

时间:2016-10-17 11:33:08

标签: mysql stored-procedures

我试图创建一个存储过程来在csv中生成一些报告。签名如下:

import matplotlib.pyplot as plt
import pandas as pd

# Dataframe consist of 3 columns
df['year'] = ['2005, 2005, 2005, 2015, 2015, 2015, 2030, 2030, 2030']
df['name'] = ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']
df['weight'] = [80, 65, 88, 65, 60, 70, 60, 55, 65]
fig,ax = plt.subplots()

# plot figure to see how the weight develops through the years
for name in ['A','B','C']:
    ax.plot(df[df.name==name].year,df[df.name==name].weight,label=name)

ax.set_xlabel("year")
ax.set_ylabel("weight")
ax.legend(loc='best')

SP根据'研究'创建一个带有条件WHERE子句的查询。输入参数。

CREATE PROCEDURE testSP (IN filename VARCHAR(100),
             IN study VARCHAR(100))

如果我使用非空研究参数调用SP,例如g

,则运行良好
DECLARE studyFilter TEXT DEFAULT '';

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

但是如果我用一个空的研究来调用SP,而不是使用空参数,则SP使用最后的研究值。

e.g。如果我按顺序打电话     致电testSP(' /tmp/test1.csv',' study1');

call testSP('/tmp/test.csv','study1');

第二次参数的值仍然是“研究1”。所以查询的WHERE子句不正确。

这怎么可能?我怎样才能正确重置该参数值?我使用MySQL 6.1和MySQL Workbench来测试SP。谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

好的找到它,我正在使用会话变量@studyFilter,而我应该使用局部变量studyFilter

将代码更改为以下版本:

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