Wie man Ora-06512 Fehler behebt

Leserfrage noch einmal. Diesmal eine Oracle-Frage und "Was zu tun ist, wenn Sie ora-06512-Fehler sehen". Ich muss zugeben, dass Oracle nicht mein Ding ist, aber ich kenne einen freundlichen DBA, der in Oracle lebt und bereit war, mir zu helfen, diese Frage für eine große Tasse Kaffee zu beantworten.

Oracle ist ein Datenbank-Management-System, das seit vierzig Jahren in verschiedenen Formen existiert. Es verwendete ursprünglich etwas namens SCOTT-Schema, benannt nach einem der ursprünglichen Mitarbeiter von Oracle. Sie haben sich sogar zum ersten Mal mit dem Benutzernamen 'scott' und dem Passwort 'tiger', das nach Scotts Katze benannt ist, bei Oracle angemeldet. Je nachdem, für was Sie Oracle verwenden, werden jetzt mehrere Schemas verwendet.

Wenn Sie mehr über Oracle erfahren möchten, ist diese Seite sehr hilfreich.

Reparieren von Ora-06512 Fehlern

Anscheinend ist ein ora-06512-Fehler ein allgemeiner Ausnahmefehler, der Ihnen sagt, wo etwas schief läuft und nicht, was schief läuft.

Zum Beispiel könnte die Fehlersyntax lauten:

ORA-01422: exact fetch gibt mehr als die angeforderte Anzahl von Zeilen zurück

ORA-06512: bei "DATABASE_NAME", Zeile 66

ORA-06512: in Zeile 1

In der ersten Zeile wird angegeben, um welchen Fehlertyp es sich handelt. In diesem Fall gibt die Abfrage mehr Daten zurück, als die Abfrage erwartet, sodass sie nicht wissen, wie sie behandelt wird. Der 'ORA-01422' Code ist der tatsächliche Fehlercode, den Sie betrachten müssen. Der ORA-06512 ist nur der allgemeine Fehlercode.

Die zweite Zeile zeigt an, wo der Fehler auftritt. Der DATABASE_NAME wird zu jeder beliebigen Datenbank sein, in der Sie gerade arbeiten. Zeile 66 ist die Zeile, in der der Fehler auftritt und die Zeile ist, die Sie überprüfen müssen, um den Fehler zu beheben.

Die dritte Zeile in der Fehlersyntax sagt Ihnen, woher der Anruf kommt. Überprüfen Sie die erste Zeile und Sie werden einen Anruf bei DATABASE_NAME sehen.

Um diesen Fehler zu beheben, müssen Sie das von ORA-01422 verursachte Problem beheben, das besagt, dass "exact fetch returns mehr als die angeforderte Anzahl von Zeilen zurückgibt", oder Sie müssen einen Ausnahme-Handler hinzufügen, um Oracle anzuweisen, es zu ignorieren. Es ist immer vorzuziehen, das Kernproblem zu lösen, das ist der richtige Weg.

Es gibt zwei Dinge, die Sie tun können. Wenn Sie erwarten, dass die Abfrage mehr als eine einzelne Zeile zurückgibt, können Sie sie ändern, damit sie nicht überrascht wird. Wenn Sie nur erwarten, dass die Abfrage eine einzelne Zeile zurückgibt, können Sie sie auch ändern.

Erwartet mehr als eine einzelne Zeile:

für X in (wähle * von t wo ...)

Schleife

- Verarbeite den X-Eintrag hier

Endschleife;

Dies sollte den Fehler in Datenbankabfragen beseitigen, bei denen mehr als eine Zeile zurückgegeben würde.

Wenn Sie nur eine einzelne Zeile erwarten, können Sie versuchen:

Start

Wählen Sie * in ....

von t wo ....

verarbeiten….

Ausnahme

wenn NO_DATA_FOUND dann

Fehlerbehandlungscode, wenn kein Datensatz gefunden wird

wenn TOO_MANY_ROWS dann

Fehlerbehandlungscode, wenn zu viele Datensätze gefunden werden

Ende;

Diese zweite Methode sollte nur die einzelne Zeile liefern, ohne den Fehler 'ORA-01422: exakter Abruf gibt mehr als die angeforderte Anzahl der Zeilen zurück' und daher den ursprünglichen ORA-06512-Fehler auszulösen.

Sie können die Abfrage auch so optimieren, dass sie nur die erste Zeile einer Antwort mit mehreren Zeilen zurückgibt. Dies kann funktionieren, wenn Sie nicht die vollständige Kontrolle über die Datenbank haben oder sich nicht zu sehr mit den Dingen anlegen wollen, aber immer noch eine Antwort brauchen.

erklären

c1 cursor für select * von t wo ...

Start

öffnen Sie c1;

hole c1 in ..

wenn (c1% nicht gefunden) dann

Fehlerbehandlung für keinen Datensatz gefunden

Ende wenn;

schließen c1;

Ende;

Ich habe dieses letzte in Aktion nicht gesehen, aber ich bin versichert, dass in Situationen, in denen mehrere Returns gefunden werden könnten, aber Sie nur eine einzelne Zeilenrückgabe und keine Fehler wünschen, dies funktioniert.

Ich kenne ein wenig SQL, genug um eine grundlegende Select-Anweisung zu schreiben, aber ich muss zugeben, dass Oracle mich geworfen hat. Obwohl es PL / SQL so ähnlich ist, fand ich mich verloren. PL / SQL ist die prozedurale Spracherweiterung von Oracle für SQL, die es offensichtlich erlaubt, viel mehr clevere Dinge zu tun als Vanilla SQL. Ich fand diese PL / SQL-FAQ nützlich, wenn Sie versuchen, etwas über Oracle zu lernen, es könnte Ihnen auch helfen.

Wie ich bereits erwähnt habe, bin ich kein DBA und weiß sehr wenig über bestimmte Datenbanken. Ich habe mein Bestes gegeben, um zu vermitteln, was mein Kumpel mir in meiner kurzen Zeit an seinem Schreibtisch und in späteren E-Mails gezeigt hat. Wenn ich etwas drastisch falsch verstanden habe, lassen Sie es mich im Kommentarbereich wissen.

Siehe Auch