Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verschachtelter Cursor in einem Cursor

Normalerweise würden Sie einfach an den beiden Tischen teilnehmen.

FOR some_cursor IN (SELECT s.col1,
                           s.col2
                      FROM sometable s
                           JOIN temp_table t ON (s.col3 = t.col1))
LOOP
  <<do something>>
END LOOP

Da Sie sich jedoch Gedanken über die Effizienz machen

  • Ist TEMP_TABLE wirklich eine temporäre Tabelle? Wenn ja warum? Es kommt äußerst selten vor, dass Oracle tatsächlich temporäre Tabellen verwenden muss, sodass ich vermute, dass Sie wahrscheinlich etwas Ineffizientes tun, um die temporäre Tabelle überhaupt zu füllen.
  • Warum haben Sie einen Cursor FOR Schleife, um die Daten von TEMP_TABLE zu verarbeiten ? Die zeilenweise Verarbeitung ist der langsamste Weg, irgendetwas in PL/SQL zu tun, daher würde es im Allgemeinen vermieden werden, wenn Sie sich Sorgen um die Effizienz machen. Aus Performance-Sicht möchten Sie SQL so maximieren, dass statt einer Schleife eine Reihe von einzeiligen INSERT ausgeführt wird oder UPDATE Operationen, würden Sie ein einzelnes INSERT ausführen oder UPDATE die eine ganze Reihe von Zeilen geändert hat. Wenn Sie Daten wirklich in Blöcken verarbeiten müssen, kommen hier PL/SQL-Sammlungen und Massenverarbeitung ins Spiel, aber das ist nicht so effizient wie reines SQL.
  • Warum haben Sie den DISTINCT in Ihrer Abfrage gegen TEMP_TABLE ? Erwarten Sie wirklich, dass es doppelte big_id gibt Werte, die nicht falsch sind? Meistens verwenden die Leute DISTINCT falsch, entweder um Probleme zu vertuschen, bei denen Daten falsch verknüpft wurden, oder wo Sie Oracle zwingen, eine teure Sortierung durchzuführen, nur für den Fall, dass in Zukunft falsche Daten erstellt werden, wenn eine Einschränkung der angemessenere Weg wäre, sich zu schützen.