2010-06-15 28 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有點貴,我不確定它是否是最快速的最有效的。