Oracle-PL/SQL - ORA-01403 "Keine Daten gefunden", wenn Sie mit "SELECT INTO"
Habe ich eine pl-sql-code auszuführen drei Abfragen sequentiell zu bestimmen, die ein match-level und einige Logik
Das Problem ist - bei der ersten Abfrage keine Ergebnisse (vollständig gültig Szenario) bekomme ich ORA-01403 Keine Daten gefunden.
Ich verstehe, dass ich brauche, zu übernehmen [ Ausnahme-Klausel, wenn NO_DATA_FOUND ]- aber, wie Sie auf hinzufügen, und gehen Sie weiter zur nächsten Abfrage?
PL/SQL Code
SELECT A into PARAM A FROM SAMPLE WHERE SOME CONDITION;
-- GOT ORA-01403 No data found HERE
MATCH_LEVEL =1;
if A is null then
do some logic;
end if
SELECT A INTO PARAM_B FROM SAMPLE WHERE SOME OTHER CONDITION
MATCH_LEVEL =2
if A is null then
do some logic 2;
end if
SELECT A INTO PARAM_B FROM SAMPLE WHERE SOME OTHER CONDITION
MATCH_LEVEL =3
if A is null then
do some logic 3;
end if
END PL/SQL Code
Nur ein Kommentar, Abgleich von Abfragen, die teuer sind - bei der ersten Abfrage eine übereinstimmung - ich brauche nicht zu Holen, Abfrage 2 und drei...
InformationsquelleAutor user648026 | 2014-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Umgeben Sie Ihre
SELECT INTO
mitbegin-end;
Dies ist wie
try
blockPL/Sql
Mit dieser Technik können Sie melden Sie der Grund, Ihre Aussage ist fehlgeschlagen.
NO_DATA_FOUND
, dannWHEN OTHERS
ist bestenfalls sinnlos und schlimmstenfalls gefährlich.Dies ist nur zu show-Technik. In jedem Fall, was ist die Gefahr? Einige andere Fehler behandelt werden? Was ist, wenn Sie schreiben, es zu melden und dann wieder zu werfen? Natürlich müssen Sie entwerfen nicht nur Ihre Sql-Block selbst, sondern auch die Fehlerbehandlung sowie.
Die Gefahr ist, dass jemand Lesen das Beispiel im wahrsten Sinne des Wortes nichts zu tun, die in diesem Abschnitt:
WHEN OTHERS THEN NULL;
, die dazu führen, dass der code zu ignorieren alle Fehler anderen alsNO_DATA_FOUND
.Wir sollten nicht denken Sie an Menschen als Idioten. Die meisten Programmierer wissen, wie man ein Programm aus dem Beispiel. Wir zeigen die Technik, Sie nehmen es von dort. General Patton sagte: "die Leute sagen, was zu tun ist, nicht wie. Und Sie werden überrascht sein, mit Ihren Einfallsreichtum".
Ich bin mir nicht denken, wer ein idiot. Allerdings, wenn jemand unerfahren genug, um auf der Suche nach der Lösung für ein
NO_DATA_FOUND
Fehler, ist es eine ziemlich gute Wette, dass Sie nicht wissen, die besten Praktiken der Umgang mit Fehlern in PL/SQL. In diesem Fall, Ihren Unterricht "etwas tun oder nichts" kann Sie buchstäblich gelesen werden, was dazu führen könnte, schlechten code. Es schien, lohnt sich ein Kommentar.InformationsquelleAutor T.S.
InformationsquelleAutor Null
Für eine
SELECT ... INTO ...
- Anweisung, die PL/SQL-engine, die annimmt, dass es eine und nur eine Zeile von der Abfrage zurückgegebenen. Wenn es keine Zeile oder mehr als eine, wird eine Ausnahme ausgelöst.FWIW, können Sie behandeln Sie solche Fälle ohne Rückgriff auf die Ausnahmebehandlung durch die Verwendung von Aggregat-Funktionen. So, es wird immer nur eine Zeile in der Ergebnismenge.
Vorausgesetzt
A
können nichtNULL
in Ihren Reihen:Wenn die
NULL
Wert ist ein möglicher Fall, fügen Sie einfach eine zusätzlicheCOUNT(*)
Spalte:SELECT INTO
gescheitert.Ich Stimme in den Allgemeinen Fall. Aber, Zitat OP: " bei der ersten Abfrage keine Ergebnisse (vollständig gültig Szenario) ..." soweit ich das verstanden habe, gibt es keine Notwendigkeit für die Protokollierung der
NO_DATA_FOUND
oderTOO_MANY_ROWS
Ausnahmen in diesem besonderen Anwendungsfall.Dies ist der Grund, warum wir hier sind. Wir lassen die OP zu entscheiden, was er oder Sie braucht, zu tun
Ich sehe performance-Problem mit diesem Ansatz, 6-db-fetch-statt der drei, Die match-Abfragen sind sehr teuer...
InformationsquelleAutor Sylvain Leroux
Oracle wird nicht zulassen, Sie zu öffnen, einen impliziten cursor (d.h. eine
select
- Anweisung in den Körper eines code-block) , gibt keine Zeilen zurück. Sie haben hier zwei Optionen (3 wirklich, zählen @Sylvain Antwort, aber das ist ein ungewöhnlicher Ansatz): verwenden Sie einen expliziten cursor oder den Fehler behandeln.Explizite Cursor
Ein expliziter cursor ist ein in den
DECLARE
Abschnitt muss es geöffnet und holte manuell (oder in einemFOR
loop). Dies hat den zusätzlichen Vorteil, dass, wenn Sie parametrisieren die Abfrage richtig ist, können Sie schreiben es einmal und verwenden Sie es mehrmals.Den Fehler behandeln
Wenn Sie wählen, um den Fehler zu behandeln, Sie müssen, um einen
BEGIN...END
- block, um den code, schmeißen Sie den Fehler. Bei Missachtung ein Fehler, es ist wichtig, dass Sie sicherstellen, dass Sie nur unter Missachtung der spezifischen Fehler, die Sie vermeiden wollen, wenn Sie generiert sich aus der spezifischen Aussage, die Sie erwarten, dass es aus ist. Wenn Sie fügen Sie einfach dieEXCEPTION
Abschnitt, um Ihre bestehendenBEGIN...END
blocken, zum Beispiel, Sie konnte nicht wissen, welche Anweisung erzeugt wurde, oder auch wenn es war wirklich der Fehler, den Sie erwarten.Während ich ihn davon abzubringen, Sie können fangen alle anderen Fehler in der gleichen exception-Blöcke. Allerdings, per definition, solche Fehler normalerweise nicht erwarten würde, so wäre es eine schlechte Praxis, um Sie zu verwerfen (Sie werden nie wissen, dass Sie auch geschehen!). Im Allgemeinen, wenn Sie eine
WHEN OTHERS
- Klausel in der Ausnahmebehandlung, dass die Klausel sollte immer Schluss mitRAISE;
, so dass der Fehler übergeben bekommt bis zu die nächste Ebene und gehen nicht verloren.Der cursor (oder Abfrage) wird nicht ausgeführt, in
declare
block:cursor cur_params (some_column_value number) is ...
aber nur, wenn man Sie öffnet:open cur_params (match_level)
.noch einmal öffnen (zum Lesen der ersten entsprechen), es führt auch alle drei, richtig?
Die Abfrage wird jedes mal ausgeführt, wenn es geöffnet wird, mit dem parameter angegeben. Der Schlüssel hier ist die Parametrisierung der Abfrage, so dass die Parameter, die Sie bieten Ihnen unterschiedliche Ergebnisse jedes mal verwendet wird (dies setzt Voraus, dass Sie ähnliche Fragen mit jeweils nur das
WHERE
- Klausel unterschiedliche).InformationsquelleAutor Allan