Gibt es eine Möglichkeit neu zu starten, einen cursor? Oracle
Ich versuche, etwas zu tun wie:
for(int i = 0; i<10; i++)
{
for(int j = 0; j<10; j++)
{
Blah;
}
}
//As you can see each time that there is a different i, j starts at 0 again.
Mithilfe der Cursor in Oracle. Aber wenn ich richtig bin, nachdem ich holt alle Zeilen aus einem cursor, es wird nicht neu gestartet. Gibt es eine Möglichkeit, dies zu tun?
Hier ist meine sql:
CREATE OR REPLACE PROCEDURE SSACHDEV.SyncTeleappWithClientinfo
as
teleCase NUMBER;
CURSOR TeleAppCursor
is
Select
distinct(casenbr)
from TeleApp;
CURSOR ClientInfoCursor
is
Select casenbr
from clientinfo
where trim(cashwithappyn) is null;
BEGIN
open TeleAppCursor;
open ClientInfoCursor;
LOOP
fetch TeleAppCursor into teleCase;
EXIT when TeleAppCursor%NOTFOUND;
LOOP
fetch ClientInfoCursor into clientCase;
EXIT when ClientInfoCursor%NOTFOUND;
if clientCase = teleCase then
update ClientInfo
set cashwithappyn = (select cashwithappyn from teleapp where casenbr = clientCase)
where casenbr = clientCase;
break;
end if;
END LOOP;
END LOOP;
END;
Habe ich online-check, und war nicht in der Lage, alles zu finden auf dieser.
- Erstens, warum "Neustart" für Sie bedeutet und warum müssen Sie auf "neu starten"? Der pseudo-code, den Sie geschrieben, was Sie versuchen zu erreichen, nicht angezeigt, die einen Neustart erfordern. Zweitens, warum wollen Sie schreiben, verschachtelte Schleifen in PL/SQL? SQL ist eine set-basierte Sprache-es wird viel effizienter (nicht zu erwähnen, viel weniger code zu schreiben, ein single
UPDATE
Aussage, dass updates jede Zeile, die Sie aktualisieren möchten, anstatt Codierung zwei Schleifen und die Ausstellung TonnenUPDATE
Aussagen, dass jedes update nur eine Zeile. - Durch die neu starten ich meine start an der Spitze der Ergebnistabelle wieder. Ich muss die Daten eingeben (cashwithappyn) der 1. Tabelle in die 2. Tabelle, nur wenn die caseNumber ist die gleiche, und nur wenn der 2. Tabelle cashwithappyn null ist.
- Ich denke, dass das schließen der cursor und dann wieder öffnen Sie es erneut, starten Sie den cursor. Aber , noch ich Stimme mit Justin, warum wollen Sie alles tun, was du getan hast in deinem code? Es könnte sein, getan in einer einfachen Weise.
- Ich habe noch nie wirklich gearbeitet, mit Oracle vor diesem Projekt.
- Schließen und erneut öffnen Sie den cursor zurück, die Ergebnisse wieder. Allerdings können die Ergebnisse unterschiedlich sein, beim zweiten mal (vorausgesetzt, dies ist ein multi-user-system, und Sie haben nicht legen Sie die Transaktionsisolationsstufe auf serialisierbar). Und Sie werden fallen die Kosten für die Ausführung der Abfrage ein zweites mal. Wenn deine Datenmengen sind klein, Sie könnten möglicherweise Holen die Daten aus dem cursor in eine lokale Sammlung, die Sie Durchlaufen mehrere Male (obwohl ich bin immer noch nicht sehen, warum würden Sie brauchen, um re-Prozess eine Zeile). Aber die meisten effizienter Ansatz wird eine einzelne SQL-Anweisung.
- Würde diese kümmern sich um die komplette Abfrage? update ClientInfo set cashwithappyn = (select cashwithappyn von teleapp wo casenbr = clientCase), wo CLIENTINFO.CASENBR = TELEAPP.CASENBR und trim(cashwithappyn) null ist;
- Unter der Annahme, dass casenbr ist einzigartig in TeleApp, können Sie: - update ClientInfo set cashwithappyn = (select cashwithappyn von teleapp wo casenbr = clientCase UND CLIENTINFO.CASENBR = TELEAPP.CASENBR ), WO trim(cashwithappyn) null ist;
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nicht den zweiten cursor an alle, nutzen Sie einfach die set-Operationen in Oracle-update die entsprechenden Datensätze ohne manuell nach Ihnen zu suchen dich:
Es ist auch eine gute Idee, keine Variablen mit den gleichen Namen wie die Spalten.
Statt einem Neustart der Cursor könnte man eine table-variable zum speichern der Ergebnisse der sql-Anweisung in einer Schleife über die Tabelle eine beliebige Anzahl von Zeiten.
Hier ist ein Beispiel für die Verwendung der SQL Fiddle-Sample-Daten.
welche Ausgänge
Hier ist die SQL Fiddle aber ich kann nicht herausfinden, wie um zu sehen, die Ausgabe von dbms_output
ORA-00922: missing or invalid option : SET SERVEROUTPUT ON