sql - tipos - procedure oracle ejemplos
Problema de bloque PL/SQL: no se encontraron datos (5)
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 oráculo pl-sql por ejemplo cuarta edición de 2009 mi problema es cuando ingreso un id. de estudiante no presente en la tabla me devuelve los siguientes errores
Error report: ORA-01403: no data found ORA-06512: at line 7 01403. 00000 - "no data found" *Cause: *Action:
pero según el libro, debería haber devuelto un valor nulo y luego seguir el flujo del caso.
Por favor, ayúdame...
gracias por adelantado
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
...
Esta información no encontrada se debe a algún tipo de datos que estamos usando.
como seleccionar empid en v_test
arriba, empid y v_test tienen que ser de tipo numérico, entonces solo se almacenarán los datos.
Así que haga un seguimiento del tipo de datos, al obtener este error, puede ser que esto ayude.
Hay un enfoque alternativo que utilicé cuando no podía confiar en el bloque EXCEPTION
al final 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;
Puede valer la pena consultar en línea la sección de erratas de su libro.
Hay un ejemplo de cómo manejar esta excepción aquí http://www.dba-oracle.com/sf_ora_01403_no_data_found.htm
Su declaración SELECT
no está buscando los datos que está buscando. Es decir, no hay ningún registro en la tabla de ENROLLMENT
con el STUDENT_ID
y SECTION_ID
dados. Puede intentar colocar algunas instrucciones 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.