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 Tonnen UPDATE 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;

InformationsquelleAutor Solid1Snake1 | 2012-09-27
Schreibe einen Kommentar