2010-06-15 6 views
0

Je reçois des valeurs séparées par des virgules pour une procédure stockée dans Oracle. Je veux traiter ces valeurs comme une table pour que je puisse les utiliser dans une requête comme:Bonne façon de traiter les valeurs séparées par des virgules dans Oracle

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

Quelle est la meilleure façon de le faire dans 11g? En ce moment, nous les parcourons un par un et les insérons dans un gtt qui, à mon avis, est inefficace.

Des pointeurs?

Répondre

1

Oracle n'est pas fourni avec un tokenizer intégré. Mais il est possible de rouler les nôtres, en utilisant les types SQL et PL/SQL. J'ai posté un exemple de solution dans this other SO thread.

Cela permettrait une solution comme ceci:

select * from tabl_a 
where column_b in (select * 
        from table (str_to_number_tokens (<csv values passed in>))) 
/
+0

mais dans cette solution, vous ne montrez jamais à quoi ressemble 'str_to_number_tokens'? – dmitry

+0

@dmitry - Peut-être que j'étais trop subtile mais qu'il y a un lien dans la phrase "J'utilise une variante de l'implémentation d'Anup Pani", c'est-à-dire http://anuppani.blogspot.com/2007/07/tokenizer-in-oracle -plsql.html – APC

0

En vous 11g pouvez utiliser le paramètre "occurrence" de REGEXP_SUBSTR pour sélectionner les valeurs directement dans SQL:

select regexp_substr(<csv values passed in>,'[^,]+',1,level) val 
from dual 
connect by level < regexp_count(<csv values passed in>,',')+2; 

B Comme regexp_substr est un peu cher, je ne suis pas sûr que ce soit le plus efficace pour être le plus rapide.

Questions connexes