Ich weiß nichts über ODP.net, aber warum alle Datensatz-Identifikatoren in eine CSV-Zeichenfolge verketten?
Ein besserer Ansatz könnte darin bestehen, einen Array-Parameter in Ihrer Prozedur zu erstellen und ein Array von Bezeichnern zu übergeben. Ich denke, es hängt davon ab, woher Sie Ihre Liste von Bezeichnern bekommen und ob sie als Array oder CSV-String beginnen. Hier
ist ein Beispiel der Verwendung eines Array-Typs und das zu Ihrer Anfrage Beitritt ohne eine temporäre Tabelle mit (Sie etwas ähnlichem mit einer IN-Liste tun könnten aber seine härtere zu binden):
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;
/
Beachten Sie, dass Die Abfrage in der Testprozedur verwendete die Funktion 'table', um das übergebene Array in eine Tabelle in der Abfrage umzuwandeln, der Sie tatsächlich auch mit anderen reellen Tabellen beitreten können.
Auch nicht, dass die Unterabfrage 'a', einen Trick verwendet, um eine gefälschte Testtabelle zu erstellen, die 10 Zeilen mit Werten von 1 bis 10 enthält (dies sind nur Testdaten, um zu beweisen, dass dies funktioniert).
den folgenden Block verwenden, können wir den Code testen funktioniert:
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;
/
Solange dbms_output eingeschaltet ist, das 1 gedruckt werden soll - 5, als die Testdatentabelle mit Ihrem Array verbunden ist!