2009-08-10 16 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; 

el código anterior que he tomado del libro de Oracle PL-SQL por ejemplo, cuarta edición 2009 mi problema es cuando entro en una identificación de estudiante no está presente en la mesa me vuelve los siguientes erroresPL problema/SQL bloque: No se encontraron datos

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

pero según el libro que debería haber devuelto un valor nulo y siga el flujo de casos ..

favor me ayude ...

gracias de antemano

+0

¿Alguna posibilidad de formatear su PL SQL como código? – pjp

+0

Se ve lindo y bonito ahora :) – pjp

Respuesta

72

Cuando selecciona INTO una variable y no hay registros devueltos, debe obtener un error NO HAY DATOS ENCONTRADOS. Creo que la forma correcta de escribir el código anterior sería envolver la instrucción SELECT con su propio bloque BEGIN/EXCEPTION/END. Ejemplo:

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

Su declaración SELECT no es encontrar los datos que está buscando. Es decir, no hay registro en la tabla ENROLLMENT con STUDENT_ID y SECTION_ID dados. Es posible que desee intentar poner algunas declaraciones DBMS_OUTPUT.PUT_LINE antes de ejecutar la consulta, imprimiendo los valores de v_student_id y v_section_id. Es posible que no contengan lo que espera que contengan.

1

Existe un enfoque alternativo utilicé cuando no podía apoyarse en el bloque EXCEPTION en el fondo de mi procedimiento. Tenía variables declaradas al principio:

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

Estos datos no encontrados se deben a algunos tipos de datos que estamos utilizando.

como seleccionar empid en v_test

anteriormente empid y v_test tiene que ser del tipo de número, entonces se almacenarán únicamente los datos.

Así que haga un seguimiento del tipo de datos, al recibir este error, puede ser que esto ayude.

Cuestiones relacionadas