Ich schreibe seit einem Jahr grundlegende Web-Apps (für eine Oracle-Datenbank), und da die Funktionen ziemlich einfach sind, halten sich die meisten von uns an reguläre FOR-Schleifen, um unsere Daten abzurufen:
for i in (select * from STUDENTS) loop
htp.prn(i.student_last_name || ', ' || i.student_first_name || ' ' || i.student_dob);
end loop;
Aber Cursor scheinen der „richtige“ Weg zu sein, Dinge zu tun. Ich kann viele Informationen darüber finden, was Cursor sind und wie sie durchlaufen werden, aber ich kann keinen soliden Grund finden, warum ich sie über reguläre FOR-Schleifen verwenden soll. Ist es abhängig von den Erfordernissen des Verfahrens? Gibt es inhärente Vorteile, die ich beachten sollte?
FOR
ist nur eine andere Möglichkeit, Cursor zu verwenden. Siehe die Dokumente: docs.oracle.com/cd/E11882_01/appdev.112/e10472/… Was macht htp.prn ()?FOR
Schleife meiner Meinung nach viel besser lesbar. Ich neige dazu, "echte" Cursor nur zu verwenden, wenn ich rückwärts und nicht nur vorwärts treten muss. Ich habe diese andere Frage gestellt, weil ich mir stattdessen eine Tabellenfunktion vorstellen kannhtp.prn()
.Antworten:
Ein Cursor kann explizit oder implizit sein, und jeder Typ kann in einer FOR-Schleife verwendet werden. Ihre Frage hat wirklich zwei Aspekte.
Warum eine explizite Cursor-FOR-Schleife über einer impliziten Cursor-FOR-Schleife verwenden?
Warum sollte eine Schleife mit einem FETCH anstelle einer FOR-Schleife ohne expliziten FETCH verwendet werden?
Hier finden Sie einige nützliche Informationen aus der Dokumentation.
Beispiel für einen impliziten Cursor FOR LOOP
Beispiel für einen expliziten Cursor FOR LOOP
Impliziter Cursor
Expliziter Cursor
Cursor FOR LOOP-Anweisungen
quelle
Der von Ihnen gepostete Code verwendet einen Cursor. Es wird eine implizite Cursorschleife verwendet.
Es gibt Fälle, in denen die Verwendung einer expliziten Cursorschleife (dh das Deklarieren einer CURSOR-Variablen im Deklarationsabschnitt) entweder saubereren Code oder eine bessere Leistung erzeugt
student_cursor
anstatt eine 30-zeilige SQL-Anweisung einzuschließen, in die eine Reihe von Logik eingebettet ist. Wenn Sie beispielsweise alle Studenten ausgedruckt haben, die für den Abschluss freigegeben wurden und an Tabellen mit ihren akademischen Aufzeichnungen, den Anforderungen ihres Studiengangs, Tabellen mit Informationen zu akademischen Beständen, Tabellen mit Informationen zu überfälligen Bibliotheksbüchern teilnehmen mussten, Tabellen mit Informationen zu nicht bezahlten Gebühren, administrativen Überschreibungen usw. Es wäre wahrscheinlich sinnvoll, den Code so umzugestalten, dass diese Abfrage nicht in der Mitte des Codes steckt, der die Präsentation der Liste für einen Benutzer betrifft. Dies könnte das Erstellen einer Ansicht beinhalten, die all diese Logik zusammenfasst. Oder es kann ein expliziter Cursor erstellt werden, der entweder als Teil des aktuellen PL / SQL-Blocks oder in einem übergeordneten PL / SQL-Block deklariert wurde (d. H. ein in einem Paket deklarierter Cursor), damit er wiederverwendbar ist. Oder Sie müssen etwas anderes für die Kapselung und Wiederverwendbarkeit tun (z. B. stattdessen eine Pipeline-Tabellenfunktion erstellen).htp.prn
,BULK COLLECT
kaufen Sie wahrscheinlich nichts. In anderen Fällen kann dies jedoch zu erheblichen Leistungsverbesserungen führen.quelle
Ich sehe, dass viele Entwickler explizite Cursor anstelle impliziter Cursor aus alter Gewohnheit verwenden. Dies liegt daran, dass dies in Oracle Version 7 immer der effizientere Weg war. Heutzutage gibt es im Allgemeinen den umgekehrten Weg. Insbesondere mit dem Optimierer, der bei Bedarf den impliziten Cursor für Schleifen in eine Massenerfassung umschreiben kann.
quelle
Kürzlich musste ich eine Reihe von Abfragen aus einer impliziten FOR-Schleife in explizite Cursor umschreiben. Der Grund war, dass die Abfragen Daten aus einer externen Datenbank über einen Link abriefen und diese Datenbank eine andere Codierung hatte als unsere lokale Datenbank. Beim Übertragen von Daten vom impliziten Cursor in einen lokal definierten Datensatztyp traten mysteriöse intermittierende Fehler auf (nur in bestimmten Zeilen). Unser DBA hat uns das erklärt, wir hätten dem selbst nicht auf den Grund gehen können. Es scheint, dass dies ein Fehler in Oracle ist, der gemeldet wurde.
Es wurde uns empfohlen, alles mit expliziten Cursorn neu zu schreiben, und der Fehler war behoben.
Nicht der Hauptgrund, warum Sie explizit über implizit verwenden möchten, aber eine Anmerkung wert.
BEARBEITEN: Oracle 12c.
quelle