PL/SQL过程未将变量绑定到游标中

PL/SQL过程未将变量绑定到游标中,sql,plsql,Sql,Plsql,我有一个程序,其中包含两个参数,格式如下: i_规则类型:“val1”、“val2”、“val3” i_geo:“瓦尔1”、“瓦尔2”、“瓦尔3” 我知道它们是正确的,因为底部的if/else语句正在工作。当我硬编码这两个参数的值或传入null时,查询工作。我可以看出它是在这种情况下运行的,因为它需要一点时间来完成并实际返回行。然而,当我传入参数时,就好像查询根本没有运行一样——它立即完成,并且是空的,没有任何错误。我目前的怀疑是变量实际上没有被绑定,但我被卡住了 PROCEDURE REPOR

我有一个程序,其中包含两个参数,格式如下:

i_规则类型:“val1”、“val2”、“val3”

i_geo:“瓦尔1”、“瓦尔2”、“瓦尔3”

我知道它们是正确的,因为底部的if/else语句正在工作。当我硬编码这两个参数的值或传入null时,查询工作。我可以看出它是在这种情况下运行的,因为它需要一点时间来完成并实际返回行。然而,当我传入参数时,就好像查询根本没有运行一样——它立即完成,并且是空的,没有任何错误。我目前的怀疑是变量实际上没有被绑定,但我被卡住了

PROCEDURE REPORT_PRC (i_rule_type IN VARCHAR2, i_geo IN VARCHAR2, results_out OUT sys_refcursor) IS

v_report_query    VARCHAR2(800);

BEGIN

v_report_query := 'SELECT r.NAME as RULE_NAME, r.DESCRIPTION as DESCRIPTION, r.RULE_ID as RULE_ID, r.AUDIENCE as RULE_TYPE, g.NAME as GEO, count(l.rule_id) as LEADS_ROUTED, max(l.LEAD_ASSIGNMENT_END) as LAST_ROUTED, a.NAME as ATTRIBUTE
FROM rule r
LEFT OUTER JOIN LEAD_DETAILED_LOG l on r.RULE_ID = l.RULE_ID
LEFT OUTER JOIN GEO g on r.GEO_ID = g.GEO_ID
LEFT OUTER JOIN RULE_ATTRIBUTE ra on r.RULE_ID = ra.RULE_ID
LEFT OUTER JOIN ATTRIBUTE a on ra.ATTRIBUTE_ID = a.ATTRIBUTE_ID';

if i_geo IS NOT NULL OR i_rule_type IS NOT NULL then 
    v_report_query := v_report_query || ' WHERE';
end if;

if i_rule_type IS NOT NULL then 
    v_report_query := v_report_query || ' r.AUDIENCE in (:i_rule_type)';
end if;

if i_geo IS NOT NULL then 
    if i_rule_type IS NOT NULL then
        v_report_query := v_report_query || ' AND';
    end if;
    v_report_query := v_report_query || ' g.NAME in (:i_geo)';
end if;

v_report_query := v_report_query || ' GROUP BY r.rule_id, r.NAME, r.DESCRIPTION, r.RULE_ID, r.AUDIENCE, l.RULE_ID, g.NAME, a.NAME ORDER BY r.NAME'; 

if i_geo IS NOT NULL AND i_rule_type IS NOT NULL then
    OPEN results_out FOR v_report_query USING i_rule_type, i_geo;
elsif i_geo IS NOT NULL then
    OPEN results_out FOR v_report_query USING i_geo;
elsif i_rule_type IS NOT NULL then
    OPEN results_out FOR v_report_query USING i_rule_type;
else
    OPEN results_out FOR v_report_query;
end if;

end REPORT_PRC;

i\u规则\u类型
为此,是否发送逗号分隔的值?如果是这样,您必须理解它将被视为
=
。您所说的
=
是什么意思?它的行为会不会像('val1'、'val2'、'val3')中的
列那样
?值也带有单引号。没有kristin,Bind变量的工作方式与您在子句中所想的不一样。。您必须将其设置为(:v1,:v2,:v3)中的
,并且您必须事先知道计数。在您的情况下,结果比较将是(“'val1'”、“'val2'”、“'val3'”)
中的
列,这类似于csv字符串的长度。如果您有一个有效的解决方案,您应该将其作为答案发布。添加到SO知识库中!然而,我怀疑你是否有一个有效的答案。计算结果为true,但这不是您想要的:
instr('VAL1','VAL9,VAL10,VAL11,VAL20')>0
您应该在标记化CSV字符串时查看此线程: