web-dev-qa-db-fra.com

Problème de bloc PL/SQL: aucune donnée trouvée erreur

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;

le code ci-dessus que j'ai tiré du livre "Oracle PL/SQL par exemple, 4e édition de 2009" mon problème est lorsque je saisis un student_id absent du tableau, il me renvoie l'erreur suivante

 Rapport d'erreur: ORA-01403: aucune donnée trouvée 
 ORA-06512: à la ligne 7 
 01403. 00000 - "aucune donnée trouvée" 
 * Cause: 
 * Action: 

mais selon le livre, il aurait dû renvoyer une valeur nulle et suivre le déroulement de la procédure.

41
Orapps

Lorsque vous sélectionnez INTO une variable et qu'aucun enregistrement n'est renvoyé, vous devriez obtenir une erreur NO DATA FOUND. Je crois que la bonne façon d'écrire le code ci-dessus serait d'encapsuler l'instruction SELECT avec son propre bloc BEGIN/EXCEPTION/END. Exemple:

...
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

Votre instruction SELECT ne trouve pas les données que vous recherchez. C'est-à-dire qu'il n'y a pas d'enregistrement dans la table ENROLLMENT avec les STUDENT_ID et SECTION_ID donnés. Vous voudrez peut-être essayer de placer certaines instructions DBMS_OUTPUT.PUT_LINE avant d'exécuter la requête, en imprimant les valeurs de v_student_id et v_section_id. Ils peuvent ne pas contenir ce que vous attendez d'eux.

2
Adam Paynter

Cela vaut peut-être la peine de vérifier en ligne la section des errata de votre livre.

Voici un exemple de gestion de cette exception http://www.dba-Oracle.com/sf_ora_01403_no_data_found.htm

2
pjp

Il y a une approche alternative que j'ai utilisée lorsque je ne pouvais pas compter sur le bloc EXCEPTION au bas de ma procédure. J'ai eu des variables déclarées au début:

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

Ces données non trouvées sont la cause d’un type de données que nous utilisons.

comme select empid into v_test

au-dessus d'empid et v_test doit être un type de nombre, alors seules les données seront stockées.

Alors gardez une trace du type de données, lorsque vous obtenez cette erreur, peut-être que cela aidera 

0
Ankur Nirmalkar