Was ist der richtige Umgang mit diesem Oracle ORA-01403: keine Daten gefunden Ausnahme?

8

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%     
Chris Holmes 01.02.2012, 22:13
quelle

5 Antworten

6

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.

%Vor%

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.

    
Justin Cave 01.02.2012 23:00
quelle
3

Sie können in diesem Fall nichts tun:

%Vor%

Dies liefert null in pRecs right?

BEARBEITEN

Zweiter Ansatz:

%Vor%     
Sérgio Michels 01.02.2012 22:25
quelle
1

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.

    
Alex Poole 01.02.2012 22:29
quelle
1

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.

    
Chris Holmes 01.02.2012 22:41
quelle
1

Wie wäre es damit, Ausnahmebehandlung zu vermeiden:

%Vor%     
miazo 30.04.2014 12:52
quelle