是否有一种相当简单的方法来获取包含逗号分隔的前缀列表的输入参数,并根据使用这些参数的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,但想知道是否有更优雅的方式......
答案 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
匹配。从那里开始,你就会明白为什么你需要右边的逗号,然后从那里开始,你也会看到为什么你需要它们在左边。