我试图创建一个存储过程来在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。谢谢!
答案 0 :(得分:1)
您的@studyFilter
对整个会话有效,但只有在条件为真时才会被修改。这就是为什么如果条件为假,它会保留先前的结果。将其初始化为NULL
或an 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;