Hier ist mein Cursor:
%Vor%Ich öffne sofort den Cursor, um diese Datensätze für die Dauer meiner Prozedur zu sperren.
Ich möchte einen Anwendungsfehler auslösen, wenn & lt; 2 Datensätze in meinem Cursor. Die Verwendung der C1% ROWCOUNT-Eigenschaft schlägt fehl, da nur die Anzahl gezählt wird, die bisher abgerufen wurde.
Was ist das beste Muster für diesen Anwendungsfall? Muss ich eine Dummy-Variable MY_TABLE% ROWTYPE erstellen und dann den Cursor durchlaufen, um sie abzurufen und zu zählen, oder gibt es einen einfacheren Weg? Wenn dies der richtige Weg ist, schließe ich alle Zeilen in meinem Cursor implizit und schließe diese Zeilen, oder bleibt sie offen, bis ich sie explizit schließe, auch wenn ich sie alle abgeholt habe?
Ich muss sicherstellen, dass der Cursor für eine Vielzahl anderer Aufgaben, die über diese Anzahl hinausgehen, offen bleibt.
NB: Ich habe gerade Ihre Frage erneut gelesen ... und Sie wollen scheitern, wenn es nur 1 Datensatz gibt .. Ich werde in Kürze ein neues Update veröffentlichen.
Lasst uns hier anfangen.
Von Oracle® Database PL / SQL Benutzerhandbuch und Referenz 10g Veröffentlichung 2 (10.2) Teilenummer B14261-01 Referenz
Alle Zeilen sind gesperrt, wenn Sie den Cursor öffnen, nicht wie sie abgerufen werden. Die Zeilen werden beim Commit oder Rollback der Transaktion entsperrt. Da die Zeilen nicht mehr gesperrt sind, können Sie nach einem Commit nicht mehr von einem FOR UPDATE-Cursor abrufen.
Sie müssen sich also keine Gedanken über die Entriegelung der Datensätze machen.
Also versuch das ..
%Vor%ALTERNATIVE ANTWORT Ich habe gelesen, dass du rückwärts antwortest, um zu beginnen, und dachtest, du wolltest verschwinden, wenn es MEHR als 1 Reihe gibt .. nicht genau eine .. also hier ist meine vorherige Antwort.
2 einfache Möglichkeiten, nach NUR 1 Datensatz zu suchen.
Option 1 - Explizite Abrufvorgänge
%Vor%Ich hoffe, Sie haben eine Idee.
Option 2 - Ausnahmeabfangen
%Vor%Zusätzlich Denken Sie daran: Mit einem expliziten Cursor .. können Sie% Ihre Variable aus dem Cursor-Datensatz anstatt der ursprünglichen Tabelle TYPE.
Dies ist besonders nützlich, wenn Sie in Ihrer Abfrage Joins haben.
Außerdem können Sie die Zeilen in der Tabelle mit einem
aktualisieren %Vor%type-Anweisung, aber ich das funktioniert nur, wenn Sie nicht die zweite Zeile "geholt" haben ..
für weitere Informationen über Cursor FOR-Schleifen .. versuchen Hier
Wenn Sie einen Fehler feststellen möchten, obwohl mehr als eine Zeile zurückgegeben wurde, versuchen Sie Folgendes:
%Vor%Wenn dies der Weg ist, es zu tun alle Zeilen in meinem Cursor abrufen schließen Sie es implizit und damit entriegeln diese Zeilen
Die Sperren sind für die Dauer der Transaktion (dh bis Sie eine Festschreibung oder Rollback durchführen) vorhanden, unabhängig davon, wann (oder ob) Sie den Cursor schließen.
Ich würde nach
gehen %Vor%Es besteht eine sehr geringe Chance, dass zwischen dem Öffnen des Cursors (Sperren von Zeilen) und dem Auswählen von Zählern eine oder mehrere Zeilen mit einem Gehalt unter 50000 in die Tabelle eingefügt werden. In diesem Fall würde der Anwendungsfehler ausgelöst aber der Cursor würde nur die Zeilen verarbeiten, die beim Öffnen des Cursors vorhanden waren. Wenn das ein Problem ist, führen Sie am Ende noch einmal eine Überprüfung von c_1% rowcount durch, und wenn dieses Problem aufgetreten ist, müssen Sie zu einem Sicherungspunkt zurückkehren.
Sie können die Transaktion starten und prüfen, ob SELECT COUNT (*) MY_TABLE WHERE SALARY & lt; 50000 größer als 1.
Tags und Links oracle plsql stored-procedures