Question

Je souhaite passer un ensemble d'identificateurs d'enregistrements dans une procédure Oracle, en utilisant une chaîne de caractères séparés par des virgules. Je veux placer cela dans une table temporaire puis rejoins ce dans un traitement ultérieur. Comment pourrais-je aller à ce sujet?

De meilleures approches que CSV on peut regretter d'entendre parler aussi. J'utilise ODP.Net pour l'accès aux données.

Était-ce utile?

La solution

Je ne sais pas quoi que ce soit au sujet ODP.net, mais pourquoi concaténer tous les identificateurs d'enregistrement dans une chaîne CSV?

Une meilleure approche pourrait être de créer un paramètre de tableau dans votre procédure et passer un tableau d'identifiants. Je suppose que cela dépend de l'endroit où vous obtenez votre liste d'identifiants de et si elles commencent comme un tableau ou une chaîne CSV?

Voici un exemple d'utilisation d'un type de tableau et se joindre à votre requête que 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 utilisé la fonction « table » pour tourner le passé dans le tableau dans une table dans la requête que vous pouvez réellement se joindre à d'autres tables réelles à.

En outre pas que la sous-requête « a », utilise une astuce pour créer une table de test faux qui contient 10 lignes avec des valeurs de 1 à 10 (ce qui est juste des données de test pour prouver que cela fonctionne).

En utilisant le 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

Autres conseils

Comment l'utilisation de IN? Comme dans select ... where id IN (...list-of-ids-here...)?

Autre que cela, je vous suggère d'insérer les valeurs dans la table temporaire manuellement avant d'appeler la procédure ou écrire une procédure spéciale qui fait l'insert pour vous, afin que vous puissiez appeler la procédure initiale dans une deuxième étape. De cette façon, vous êtes beaucoup plus flexible que lorsque vous farcir tout en une seule méthode.

LOADER SQL est idéal pour cette tâche

http: // Télécharger -east.oracle.com/docs/cd/B10501_01/server.920/a96652/ch03.htm#1656

Vous pouvez spécifier plusieurs formats pour les dates et il y a beaucoup d'options utiles pour l'importation de données dans Oracle de CSV.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top