it-swarm.com.de

PL/SQL-Blockproblem: Es wurden keine Daten gefunden

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.

41
Orapps

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
      ...
82
brian newman

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.

2
Adam Paynter

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

2
pjp

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;
1
John Harris

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 

0
Ankur Nirmalkar