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!