SET SERVEROUTPUT ON
DECLARE
v_student_id NUMBER := &sv_student_id;
v_section_id NUMBER := 89;
v_final_grade NUMBER;
v_letter_grade CHAR(1);
BEGIN
SELECT final_grade
INTO v_final_grade
FROM enrollment
WHERE student_id = v_student_id
AND section_id = v_section_id;
CASE -- outer CASE
WHEN v_final_grade IS NULL THEN
DBMS_OUTPUT.PUT_LINE ('There is no final grade.');
ELSE
CASE -- inner CASE
WHEN v_final_grade >= 90 THEN v_letter_grade := 'A';
WHEN v_final_grade >= 80 THEN v_letter_grade := 'B';
WHEN v_final_grade >= 70 THEN v_letter_grade := 'C';
WHEN v_final_grade >= 60 THEN v_letter_grade := 'D';
ELSE v_letter_grade := 'F';
END CASE;
-- control resumes here after inner CASE terminates
DBMS_OUTPUT.PUT_LINE ('Letter grade is: '||v_letter_grade);
END CASE;
-- control resumes here after outer CASE terminates
END;
ich habe den obigen Code aus dem Buch "Oracle PL/SQL von Example, 4th Edition 2009" genommen. Mein Problem ist, wenn ich einen student_id
eingebe, der nicht in der Tabelle vorhanden ist, wird der folgende Fehler zurückgegeben
Fehlerbericht: ORA-01403: Keine Daten gefunden ORA-06512: in Zeile 7 01403. 00000 - "Keine Daten gefunden" * Ursache: * Aktion:
laut dem Buch hätte es jedoch einen Nullwert zurückgeben sollen und dem Fall folgen.
Wenn Sie INTO eine Variable auswählen und keine Datensätze zurückgegeben werden, sollten Sie den Fehler NO DATA FOUND erhalten. Ich glaube, der korrekte Weg zum Schreiben des obigen Codes wäre, die SELECT-Anweisung mit ihrem eigenen BEGIN/EXCEPTION/END-Block zu umschließen. Beispiel:
...
v_final_grade NUMBER;
v_letter_grade CHAR(1);
BEGIN
BEGIN
SELECT final_grade
INTO v_final_grade
FROM enrollment
WHERE student_id = v_student_id
AND section_id = v_section_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_final_grade := NULL;
END;
CASE -- outer CASE
WHEN v_final_grade IS NULL THEN
...
Ihre SELECT
-Anweisung findet die gesuchten Daten nicht. Das heißt, es gibt keinen Datensatz in der ENROLLMENT
-Tabelle mit dem angegebenen STUDENT_ID
und SECTION_ID
. Möglicherweise möchten Sie einige DBMS_OUTPUT.PUT_LINE
-Anweisungen vor dem Ausführen der Abfrage einfügen, indem Sie die Werte von v_student_id
und v_section_id
drucken. Sie enthalten möglicherweise nicht das, was Sie erwarten.
Vielleicht lohnt es sich, online nach Errata für Ihr Buch zu suchen.
Es gibt ein Beispiel für die Behandlung dieser Ausnahme hier http://www.dba-Oracle.com/sf_ora_01403_no_data_found.htm
Es gibt einen alternativen Ansatz, den ich verwendet habe, wenn ich mich nicht auf den EXCEPTION
-Block am Ende meiner Prozedur verlassen konnte. Ich hatte am Anfang Variablen deklariert:
my_value VARCHAR := 'default';
number_rows NUMBER := 0;
.
.
.
SELECT count(*) FROM TABLE INTO number_rows (etc.)
IF number_rows > 0 -- Then obtain my_value with a query or constant, etc.
END IF;
Diese Daten wurden nicht gefunden, da einige Datentypen verwendet werden.
wie select empid in v_test
über empid und v_test muss Zahl sein, dann werden nur die Daten gespeichert.
Verfolgen Sie also den Datentyp. Wenn Sie diesen Fehler erhalten, kann dies hilfreich sein