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