Ich habe eine DB-Tabelle, die ich mehr oder weniger wie eine Warteschlange behandle. Ich versuche, einen einzelnen Gegenstand daraus zu holen. Dies funktioniert, außer wenn SELECT..INTO fehlschlägt (was passieren kann, wenn nur ein Element in der Warteschlange ist und zwei Benutzer auf separaten Rechnern versuchen, es abzurufen; nur eines wird gewinnen).
Dies führt zu der bekannten Ausnahme ORA-01403: keine Daten gefunden . Ich habe versucht, den SP so zu ändern, dass er in diesem Fall den NULL-Datensatz zurückgibt - die gleiche Art von Ergebnis, dass eine Abfrage keine Datensätze finden würde - aber ohne Erfolg. Ich mache hier etwas falsch.
%Vor% Ich würde den Ausnahmebehandler um den Codebereich legen, der den Fehler verursacht. Wenn email_id
NULL ist, wird UPDATE
keine Zeilen aktualisieren, und SELECT
gibt keine Zeilen zurück.
Beachten Sie jedoch, dass dieser Code nicht verhindert, dass zwei verschiedene Aufrufer in derselben Zeile arbeiten. Wenn zwei Sitzungen diese Prozedur gleichzeitig aufrufen, ist es durchaus möglich, dass beide dieselbe Zeile auswählen. Wenn Sie das verhindern möchten, müsste SELECT
die ausgewählte Zeile mit der FOR UPDATE
-Klausel sperren.
Sie können in diesem Fall nichts tun:
%Vor% Dies liefert null in pRecs
right?
BEARBEITEN
Zweiter Ansatz:
%Vor% select null from ssq_emails
erhält immer noch eine 1403, wenn in der Tabelle keine Datensätze vorhanden sind. Ich bin mir nicht sicher, ob Sie im Exception-Handler etwas tun möchten. Ich bin mir nicht sicher, wie Ihr Aufrufer mit pRecs
umgehen wird, obwohl er leer ist.
Dies wurde dadurch gelöst:
%Vor%Es funktioniert, weil der RefCursor geöffnet werden muss. Ich brauche ein leeres Ergebnis, und dies scheint eine sichere Möglichkeit zu sein, dies zu garantieren, da die ID die PK ist und nicht null sein kann.
Tags und Links oracle exception stored-procedures