2009-05-12 9 views
1

Je souhaite passer un ensemble d'identificateurs d'enregistrement dans une procédure Oracle, en utilisant une chaîne séparée par des virgules. Je veux placer ceci dans une table de temp et rejeter ensuite cela dans le traitement ultérieur. Comment pourrais-je m'y prendre?Analyse CSV (valeurs séparées par des virgules) dans Oracle

De meilleures approches que les CSV seraient également intéressantes. J'utilise ODP.Net pour l'accès aux données.

Répondre

2

Je ne sais rien à propos de ODP.net, mais pourquoi concaténer tous les identifiants d'enregistrement dans une chaîne CSV? Une meilleure approche peut être de créer un paramètre tableau dans votre procédure et passer un tableau d'identifiants po Je suppose que cela dépend de l'endroit où vous obtenez votre liste d'identifiants et s'ils commencent comme un tableau ou une chaîne CSV?

Voici un exemple d'utilisation d'un type de tableau et se joindre à qui à votre requête sans utiliser une table temporaire (vous pouvez faire quelque chose de similaire avec une liste IN mais son plus difficile à lier):

create or replace type my_test_type as object (id integer); 

create or replace type my_test_type_a as table of my_test_type; 

create or replace procedure my_test_proc(i_ids in my_test_type_a) 
is 
begin 

for row in (
    select a.l from 
    (
    select level l from dual connect by level <= 10 
    ) a, table(i_ids) b 
    where a.l = b.id 
) loop 
    dbms_output.put_line(row.l); 
end loop; 
end; 
/

Notez que la requête dans la procédure de test utilisait la fonction 'table' pour transformer le tableau passé en tableau dans la requête à laquelle vous pouvez réellement joindre d'autres tables réelles.

Aussi pas que la sous-requête 'a', utilise une astuce pour créer une fausse table de test qui contient 10 lignes avec des valeurs de 1 à 10 (ce sont juste des données de test pour prouver cela fonctionne).

Utilisation du bloc suivant, nous pouvons tester le code fonctionne:

declare 
    v_id my_test_type; 
    v_ids my_test_type_a; 
begin 
    v_id := my_test_type(1); 
    v_ids := my_test_type_a(); 
    for i in 1.. 5 loop 
    v_id := my_test_type(i); 
    v_ids.extend; 
    v_ids(i) := v_id; 
    end loop; 
    my_test_proc(v_ids); 
end; 
/

Tant que DBMS_OUTPUT est, cela devrait imprimer: 1 - 5, comme la table de données de test est jointe à votre tableau!

0

Comment utiliser IN? Comme dans select ... where id IN (...list-of-ids-here...)? Sinon, je suggère d'insérer manuellement les valeurs dans la table temporaire avant d'appeler la procédure ou d'écrire une procédure spéciale pour vous, afin que vous puissiez appeler la procédure originale dans une seconde étape. De cette façon, vous êtes beaucoup plus flexible que lorsque vous bourrez tout dans une seule méthode.