2009-05-12 8 views
1

Ich würde gerne eine Reihe von Datensatz-IDs in eine Oracle-Prozedur übergeben, mit einer durch Kommas getrennten Zeichenfolge. Ich möchte dies in eine temporäre Tabelle einfügen und dann in der weiteren Verarbeitung abmelden. Wie würde ich darüber gehen?Parse CSV (kommagetrennte Werte) in Oracle

Bessere Ansätze als CSVs wäre auch toll zu hören. Ich verwende ODP.Net für den Datenzugriff.

Antwort

2

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!

0

Wie wäre es mit IN? Wie in select ... where id IN (...list-of-ids-here...)?

Ansonsten würde ich vorschlagen, die Werte manuell in die temporäre Tabelle einzufügen, bevor Sie die Prozedur aufrufen oder eine spezielle Prozedur schreiben, die die Einfügung für Sie ausführt, damit Sie die ursprüngliche Prozedur in einem zweiten Schritt aufrufen können. Auf diese Weise sind Sie viel flexibler als wenn Sie alles in eine einzige Methode stopfen.