Oracle-cursor läuft durch das Letzte Element zweimal
Ich habe eine ein-cursor-Schleife, die das Gebäude von einer Zeichenfolge durch Verkettung der Inhalt einer Tabelle zusammen, mit code, die entlang dieser Linien:
OPEN cur_t;
LOOP
FETCH cur_t INTO v_texttoadd;
v_string := v_string || v_texttoadd;
EXIT WHEN cur_t%notfound;
END LOOP;
Das problem ist natürlich, dass das Letzte Element, das Hinzugefügt wird, zweimal, weil das system läuft noch einmal durch bevor Sie feststellen, dass es nichts mehr zu finden.
Habe ich versucht, das Spiel mit so etwas wie
OPEN cur_t;
WHILE cur_t%found;
LOOP
FETCH cur_t INTO v_texttoadd;
v_string := v_string || v_texttoadd;
END LOOP;
Aber das schien nicht zu etwas zurückkehren an alle.
Welche syntax muss ich verwenden, so dass jede Zeile nur angezeigt wird, in die resultierende Zeichenfolge einmal?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, diese:
Dies funktioniert, da das %notfound ist gesetzt, wenn die FETCH ausgeführt wird, und es gibt keine weiteren Zeilen mehr zu Holen. In Ihrem Beispiel haben Sie überprüft, %notfound nach der Verkettung und als ein Ergebnis, Sie hatte das doppelte am Ende.
Richtigen Antworten wurden bereits gegeben, aber gerade die Ausarbeitung ein bisschen.
Simulation Ihrer aktuellen situation:
Hier MILLER ist zweimal gedruckt. Nur durch Umschalten der EXIT-Anweisung und die v_string Zuordnung, Sie erhalten das gewünschte Ergebnis:
Jedoch, Ihre PL/SQL-code wird leichter, wenn die Verwendung einer cursor-for-Schleife. Sie können dann überspringen Sie die v_texttoadd variable und die Anzahl der Zeilen in der loop lässt:
Können Sie auch direkt SQL um den Auftrag zu erfüllen. Ein Beispiel mit der SQL model Klausel, wenn Sie auf version 10g oder höher:
Grüße,
Rob.
%notfound ist gesetzt, wenn die fetch fehlschlägt zum abrufen einer neuen Zeile.
weitere Möglichkeit (das vermeidet die "wenn"s und "exit wenn"s):
Einfache Antwort, auch wenn Sie möglicherweise nicht die beste:
Ich habe viele cursor-basierte Lösungen in Microsoft SQL, das immer perfekt funktioniert (die Guten alten Tage! Ich möchte meinen SQL Server wieder so viel!) aber alle Antworten auf diese Frage erwies sich als falsch für mich, die Letzte Zeile des Cursors wird IMMER zweimal ausgeführt, egal wie eng ich folgte die Methode, die von Ihnen vorgeschlagen.
Vergessen Sie das nicht -, während
loop
und vergessenexit
ist das, was Sie tun MÜSSEN, um zu vermeiden, doppelte Ausführung (ziemlich viel, was Sie tun, in T-SQL auch!).Was ich wirklich nicht verstehe, ist, warum alle Oracle knowledge base-Artikel und Foren-Beiträge (und stackoverflow) fördert diese exit-in-a-loop-Lösung, die ist natürlich falsch!