2010-06-15 158 views
0

我将通过逗号分隔值传递给oracle中的存储过程。我希望把这些值作为一个表,这样我可以像查询中使用它们:在oracle中处理逗号分隔值的好方法

select * from tabl_a where column_b in (<csv values passed in>) 

什么是在11g中做到这一点的最好方法是什么?

现在我们正在逐一循环并将它们插入到我认为效率低下的gtt中。

任何指针?

回答

1

Oracle不附带内置标记器。但是可以使用SQL类型和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>))) 
/
+0

但在该解决方案中,你永远不会显示'str_to_number_tokens'看起来像什么? – dmitry 2010-06-15 22:00:20

+0

@dmitry - 也许我太微妙了,但是在“我正在使用Anup Pani的实现变体”一句中嵌入了一个链接,即http://anuppani.blogspot.com/2007/07/tokenizer-in-oracle -plsql.html – APC 2010-06-16 01:17:59

0

在11g中,您可以使用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; 

B因为regexp_substr有点贵,我不确定它是否是最快速的最有效的。