我将逗号分隔值传递给oracle中的存储过程。我想将这些值视为一个表,以便我可以在查询中使用它们:
select * from tabl_a where column_b in (<csv values passed in>)
在11g中执行此操作的最佳方法是什么?
现在我们逐个循环这些并将它们插入到我认为效率低下的gtt中。
任何指针?
答案 0 :(得分:1)
Oracle没有内置的tokenizer。但是可以使用SQL Types和PL / SQL来推广我们自己的。我在this other SO thread发布了一个示例解决方案。
这样可以实现这样的解决方案:
select * from tabl_a
where column_b in ( select *
from table (str_to_number_tokens (<csv values passed in>)))
/
答案 1 :(得分:1)
这解决了完全相同的问题
答案 2 :(得分:0)
在11g中你可以使用&#34;发生&#34; REGEXP_SUBSTR的参数,用于直接在SQL中选择值:
select regexp_substr(<csv values passed in>,'[^,]+',1,level) val
from dual
connect by level < regexp_count(<csv values passed in>,',')+2;
但是由于regexp_substr有点昂贵,我不确定它是否是最快的方面。