2009-08-10 10 views
37
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 j'ai pris de l'oracle livre pl-sql par exemple quatrième édition 2009 mon problème est quand j'entrer dans un numéro d'étudiant ne figure pas dans la table, il me retourne les erreurs suivantesproblème PL/bloc SQL: Aucune donnée trouvée

 
Error report: ORA-01403: no data found 
ORA-06512: at line 7 
01403. 00000 - "no data found" 
*Cause:  
*Action: 

mais selon le livre aurait dû retourner une valeur nulle puis suivre le flux de cas ..

s'il vous plaît, aidez-moi ...

merci à l'avance

+0

Y a-t-il une chance de formater votre PL SQL en code? – pjp

+0

On dirait bien et joli maintenant :) – pjp

Répondre

72

Lorsque vous sélectionnez INTO dans une variable et qu'il n'y a aucun enregistrement, vous devriez obtenir une erreur NO DATA FOUND. Je crois que la façon correcte d'écrire le code ci-dessus serait d'envelopper 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 
     ... 
2

Votre déclaration SELECT ne trouve pas les données que vous recherchez. C'est-à-dire, il n'y a aucun enregistrement dans le tableau ENROLLMENT avec le donné STUDENT_ID et SECTION_ID. Vous pouvez essayer de mettre quelques 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.

1

Il y a une autre approche je quand je ne pouvais pas compter sur le bloc EXCEPTION au fond 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; 
0

Cette donnée non trouvée est due au type de données que nous utilisons.

comme select empid dans v_test

ci-dessus empid et v_test doit être le type de numéro, seules les données seront stockées. Donc, gardez une trace du type de données, en obtenant cette erreur, peut être cela aidera.

Questions connexes