2009-02-26 2 views
2

Ich habe gehört, dass es eine gute Praxis ist Ihre Datensätze in PL/SQL zu definieren, indem das% ROWTYPE Attribut. Dies spart Tipparbeit und ermöglicht es, dass Ihr Paket auch dann noch funktioniert, wenn eine Spalte hinzugefügt oder gelöscht wird. (Korrigieren Sie mich, wenn ich falsch liege!)PL/SQL: Best Practice zum Abrufen von 2 oder mehr verbundenen Tabellen von einem Cursor?

Wenn ich jedoch von einem Cursor abrufe, der einen Join enthält, finde ich, dass ich in einen Programmierer-definierten Datensatz holen muss, der eine (möglicherweise lange) enthält handgeschriebene Liste jeder vom Join zurückgegebenen Spalte.

Also meine Frage ist: Ist es möglich, in verschachtelte Datensätze zu holen, oder in eine Liste von Datensätzen holen, oder tun etwas so eine hässliche Flickschusterei zu vermeiden? Alles, was ich versucht habe, führt zu einem Fehler, weil der Datensatz nicht mit dem übereinstimmt, was vom Cursor zurückgegeben wird.

Rückkehr das Ergebnis einer Verknüpfung unter Verwendung eines Cursors scheint wie eine solche gemeinsame mir Anwendungsfall, dass es seltsam ist, dass nichts diese in der Suche kommt zusammen.

Vielen Dank.

+0

Ich gehe davon aus, wenn Sie sagen „auch wenn eine Zeile hinzugefügt oder gelöscht wird.“ Du meintest "selbst wenn eine Spalte hinzugefügt oder gelöscht wird." –

+1

Dies ist ziemlich weit von einem Klud. Es ist genau so, wie es funktionieren soll. –

Antwort

8

Sie können Benutzer den Cursor% rowtype.

Probe:

declare 
cursor c_c is 
select emp.*, dept.* -- use aliasses if columns have same name 
from emp 
, dept; -- for sample no join condition 

r_c c_c%rowtype; 

begin 
    for r_c in c_c loop -- with for loop even the definition of r_c is not needed. 
    ... 
    end loop; 
end; 
/
+0

Wow! Du schaukelst. Daran hätte ich nie gedacht. Danke. –

+1

Im Anwendungsbeispiel Sie (für R_c in C_C ...) geben, ist es nicht einmal notwendig, die R_c Variable oder seine Art zu erklären. Die for-Schleife macht das implizit. Aber wenn Sie explizite FETCHES machen müssen, ist dies definitiv nützlich. –

5

Warum auch mit der Cursor-Deklaration die Mühe machen?

Dies entspricht.

begin 
    for r_c in (select emp.*, dept.* from emp, dept) loop 
    ... 
    end loop; 
end; 

Ich sehe in Ihrem Kommentar, dass Sie dies erwähnen. Aber ich sehe die explizite Cursorsyntax so sehr verwendet, ich denke, es ist wichtig zu zeigen.

Verwandte Themen