PL / SQL存储过程使用逗号分隔参数来驱动动态LIKE子句?

时间:2017-02-13 17:00:42

标签: oracle plsql

是否有一种相当简单的方法来获取包含逗号分隔的前缀列表的输入参数,并根据使用这些参数的select语句返回游标?

即。 (伪代码)

PROCEDURE get_by_prefix(p_list_of_prefixes IN varchar2, r_csr OUT SYS_REFCURSOR)
IS
BEGIN
OPEN r_csr FOR
SELECT * FROM my_table where some_column LIKE (the_individual_fields_from p_list_of_prefixes ||'%')
END

我尝试了各种组合,现在有两个问题 - 将输入强制转换为合适的表(我认为它需要进入表类型而不是VARCHAR2_TABLE),其次要使like子句有效地成为从内部'pseudotable'中选择......

编辑:似乎人们正在建议使用'IN'和一组潜在价值的方法 - 而我正在考虑使用LIKE。我可以使用类似的技术 - 构建动态SQL,但想知道是否有更优雅的方式......

2 个答案:

答案 0 :(得分:0)

PL / SQL没有逗号分隔列表的概念,也没有像Perl等那样的内置分割器,因此您必须使用其中一种手动方法,例如:

https://stewashton.wordpress.com/2016/08/01/splitting-strings-surprise

Other methods可用。)然后,只需要在一个步骤中填充集合并在下一个步骤中使用它,或者将两者合并为:

declare
    p_list_of_prefixes varchar2(100) := 'John,Jim,Jules,Janice,Jenny';
begin
    open :refcur for
        with params as
             ( select x.firstname
               from   xmltable(
                          'ora:tokenize($X, "\,")'
                          passing p_list_of_prefixes as x
                          columns firstname varchar2(4000) path '.'
                      ) x
             )
           , people as
             ( select 'Dave Clark' as fullname from dual union all
               select 'Jim Potter' from dual union all
               select 'Jenny Jones' from dual
             )
        select x.firstname, p.fullname
        from   params x
               left join people p on p.fullname like x.firstname || '%';
end;

输出:

FIRSTNAME      FULLNAME
-------------- -----------
John           
Jim            Jim Potter
Jules          
Janice         
Jenny          Jenny Jones

答案 1 :(得分:0)

以您想要的方式使用LIKE很简单,但这是错误的解决方案。 (见原帖后的评论)。

无论如何 - 如果您的上级命令或其他一些半正当理由,必须使用LIKE条件,它应该如下所示:

... where ',' || p_list_of_whatever || ',' like '%,' || some_column || ',%

需要在比较双方的两端连接逗号,因为您不希望列中的Jo与输入列表中的John匹配。从那里开始,你就会明白为什么你需要右边的逗号,然后从那里开始,你也会看到为什么你需要它们在左边。