2010-11-19 3 views
3

Eine gespeicherte Prozedur ist angegeben, die nicht geändert werden kann. Es gibt einen Cursor mit einer Anzahl von Spalten im Ergebnis zurück. Gibt es einen einfachen Weg in Oracle BULK COLLECT INTO nur eine Teilmenge der Spalten durch den Cursor zur Verfügung gestellt?Massensammeln einer Untergruppe von Spalten von Oracle Cursor

FOR Schleifen und neue Sammlungstypen sollten vermieden werden. Ich möchte nicht alle Daten vom Cursor abrufen, nur die Daten, die benötigt werden.

Zum Beispiel auf BULK COLLECTION INTO alle Spalten aus dem Cursor funktionieren würde, wie folgt vor:

FETCH s_cursor BULK COLLECT INTO staff_ids; 
+0

Hmmm, ich sehe, Sie haben eine zusätzliche Einschränkung für keine neuen Sammlungstypen hinzugefügt. Welches Problem versuchen Sie zu lösen? Soll es die Leistung verbessern? –

+0

Ja, im Grunde möchte ich alle Ressourcen der Sprache verwenden, um Leistungslecks zu vermeiden. Ich denke, ich muss eine gespeicherte Prozedur kopieren und nicht benötigte Spalten entfernen, um zu vermeiden, dass mehr Daten als benötigt abgerufen werden. Obwohl dies zu einer Code-Duplizierung führen wird. – Leonid

+1

Ja, um Performance-Lecks zu vermeiden, benötigen Sie eine modifizierte/neue gespeicherte Prozedur. Wenn Sie nach dem Öffnen eines Cursors unerwünschte Spalten platzieren, bedeutet dies, dass die Datenbank bereits die ganze Arbeit erledigt hat. Daher ist das Performance-Leck bereits eingetreten. –

Antwort

2

Die kurze Antwort ist "nein", Sie müssen eines der Dinge tun, die Sie gesagt haben, Sie wollen nicht tun, wenn Sie die gespeicherte Prozedur ändern können, oder eine neue gespeicherte Prozedur geschrieben, die was macht Sie wollen.

1

Sie nicht sofort von unerwünschten Spalten verfügen kann.

Sie könnten PL/SQL-Tabellen für jede Spalte des Cursors wie folgt erklären:

type c_col1 is table of s_cursor.col1%type index by pls_integer; 
type c_col2 is table of s_cursor.col2%type index by pls_integer; 
type c_col3 is table of s_cursor.col3%type index by pls_integer; 
t_col1 c_col1; 
t_col2 c_col2; 
t_col3 c_col3; 

und Masse in diese Tabellen sammeln:

fetch s_cursor bulk collect into t_col1, t_col2, t_col3; 

und löschen Sie die Sammlungen, die Sie nicht brauchen, :

Dies ist jedoch mehr Code zum Schreiben und benötigt mehr Zeit zum Ausführen als nur b ulk Sammeln aller Spalten vom Cursor und vortäuschen, dass die unerwünschten Spalten nicht da sind.

Verwandte Themen