Ich habe eine Cursor-Schleife, die eine Zeichenkette durch Verketten des Inhalts einer Tabelle unter Verwendung von Code in diesen Zeilen erstellt:
%Vor%Das Problem ist natürlich, dass das letzte Element zweimal hinzugefügt wird, weil das System es noch einmal durchläuft, bevor es bemerkt, dass es nichts mehr zu finden gibt.
Ich habe versucht, mit etwas wie
herumzuspielen %Vor%Aber das schien überhaupt nichts zurückzugeben.
Welche Art von Syntax sollte ich verwenden, damit jede Zeile nur einmal in der resultierenden Zeichenfolge erscheint?
Sie können dies versuchen:
%Vor%Das funktioniert, weil% notfound gesetzt ist, wenn FETCH ausgeführt wird und keine weiteren Zeilen mehr abzurufen sind. In Ihrem Beispiel haben Sie% nonfound nach der Verkettung überprüft und als Ergebnis hatten Sie das Duplikat am Ende.
Richtige Antworten wurden bereits gegeben, aber nur ein wenig ausgearbeitet.
Simulieren Sie Ihre aktuelle Situation:
%Vor%Hier wird MILLER zweimal gedruckt. Indem Sie nur die EXIT-Anweisung und die v_string-Zuweisung wechseln, erhalten Sie das gewünschte Ergebnis:
%Vor%Ihr PL / SQL-Code wird jedoch einfacher, wenn Sie einen Cursor-for-Loop verwenden. Sie können dann die Variable v_texttoadd überspringen und die Anzahl der Zeilen in Ihrer Schleife verringert sich:
%Vor%Sie können auch direktes SQL verwenden, um den Job auszuführen. Ein Beispiel mit der SQL-Klausel, wenn Sie Version 10g oder höher haben:
%Vor%Grüße, Rob.
% notfound wird gesetzt, wenn Fetch keine neue Zeile abrufen kann.
ein anderer möglicher Weg (dieser vermeidet die "if" s und "exit when" s):
%Vor%Ich habe viele Cursor-basierte Lösungen in Microsoft SQL gemacht, die immer perfekt funktionierten (Gute alte Zeiten! Ich möchte meinen SQL Server so sehr zurück!), aber alle Antworten auf diese Frage haben sich für mich als falsch herausgestellt Zeile des Cursors wird IMMER zweimal ausgeführt, egal wie genau ich die von ihnen vorgeschlagene Methode befolgte.
Vergiss das non-while loop
und vergiss exit
, das musst du tun, um doppelte Ausführung zu vermeiden (was du auch in T-SQL tust!).
Was ich wirklich nicht verstehe, ist, warum alle Oracle Knowledge Base-Artikel und Forenbeiträge (und stackoverflow) diese Exit-in-a-Loop-Lösung fördern, die offensichtlich falsch ist!