Yo trabajo con PL/SQL, el lenguaje de programación de Oracle. He pensado poner tips sobre el porqué se dan algunos de los errores comunes y cómo evitarlos/solucionarlos. En principio está pensado como algo sencillo, para ayudar a aquellos que se inician en este lenguaje.
El primer error sobre el que escribiré es el ORA-01403 No data found. Es bastante común y su motivo es bastante sencillo: cuando un SELECT INTO no devuelve ningún resultado. Por ejemplo:
Como el query anterior no devuelve ningún resultado, Oracle arroja el error ORA-01403.
Cómo manejarlo
Se puede manejar este error encerrando el query dentro de un bloque BEGIN END y controlando la excepción. Por ejemplo
-
BEGIN /*Inicio del script o del procedimiento*/
-
--LÃneas de Código
-
(...)
-
BEGIN /*Inicio del bloque donde está el query que puede no devolver ninguna fila*/
-
SELECT nombre
-
INTO variable
-
FROM tabla_empleados a
-
WHERE a.idEmpleado = valor_que_no_existe;
-
variable := NULL;
-
END; /*Fin del bloque donde está el query que puede no devolver ninguna fila*/
-
(...)
-
--Continuación del script
-
--Código para manejar otras excepciones
-
END; /*Fin del script o del procedimiento*/
Al controlar la excepción dentro de un bloque BEGIN END el programa continuará hasta el final sin mostrar un mensaje de error. También es posible controlar la excepción en el bloque BEGIN END principal si lo que se desea es que el script o procedimiento termine




26 Comentarios
También se puede usar un cursor, asà en el caso de que no devolviera nada no darÃa el error.
DECLARE /*Inicio del script o del procedimiento*/
CURSOR c_cursor is
SELECT nombre
FROM tabla_empleados a
WHERE a.idEmpleado = valor_que_no_existe;
BEGIN
–LÃneas de Código
(…)
OPEN c_cursor;
FETCH c_cursor INTO variable;
IF c_cursor%NOTFOUND THEN
variable := NULL;
END IF;
CLOSE c_cursor;
(…)
–Continuación del script
EXCEPTION
WHEN OTHERS THEN
–Código para manejar otras excepciones
END; /*Fin del script o del procedimiento*/
Doy clases en la universidad (en las Islas Baleares de España) y la verdad es que el error “ORA-01403 No data found” es el tÃpico que me cometen en las prácticas todos los años. Gracias por publicar un ejemplo de cómo solucionarlo fácilmente. Miraré de comentar el artÃculo como referencia entre los alumnos.
Muy buena tu publicacion sobre este error, y esta es muy clara la forma que la explicaste.
Gracias.
Saludos,
Muy buen comentario!!! me quedo super claro!
Muy buena referencia, fue de mucha ayuda. esta muy claro
gracias por la aclaración… ya estaba por arrancarme los pelos…
saludos desde Panamá
Saludos, desde Caracas, Venezuela.
Buena Publicación!
Me salvó de un artificio muy largo.
Saludos desde Peru.
Gracias por sacarme de una buen apuro te felicito te explicas a la perfeccion.
Esta muy claro, gracias por el apoyo.
Slds desde Lima Perú
este error tambien se da, si envias el foco a un campo que es de solo visualizacion, esto cuando trabajas en varias ventanas.
Excelente!!! gracias por el aporte..
Saludos desde Chile.
¿este error es posible al realizar “select 1 from dual”?
Dibeka,
select 1 from dual da “1″. No creo que origine el NO DATA FOUND
Gracias!!
Me habrÃa evitado unas horas de estrés, si hubiése recurrido antes a San Google!
Muy buen aporte.
Demasiado Bueno Gracias… Slds des Costa Rica
Tengo una duda respecto a la excepcion no_data_found. tengo el siguiente codigo en una forma:
if to_char(:dsp_date,’MI’)<30 then
:dsp_date:=to_date(to_char(:dsp_date,'DD-MM-YYYY HH24')||':00','DD-MM-YYYY HH24:MI');
else
:dsp_date:=to_date(to_char(:dsp_date,'DD-MM-YYYY'||(to_char(:dsp_date,'HH24')+1)||':00'),'DD-MM-YYYY HH24:MI');
end if;
convierte la fecha de un 22-04-2010 12:15 a 22-04-2010 12:00… eso si lo hace bien, pero si la fecha es 22-04-2010 12:35 me marca la excepcion (el resultado deseado seria 22-04-2010 13:00)
saludos y gracias!!
se me olvido comentar que aunque este manejando la excepcion no hace lo que deberia cuando esta ocurra, solo muestra el mensaje de error en la parte inferior izquierda.
olvidenlo, ya quedo jejeje fue un error en los parentesis del primer to_char
. saludos!!
Estimados,
Agradeceré si me pudieran ayudar, tengo un error ORA-01403, que según teorÃa no debiera ocurrir, comento por que:
Tengo una sentencia SELECT que me arroja una seria de filas como resultado, al agregar la sentencia INTO me aparece el error ORA-0140.
Ejemplo:
SELECT nombre
FROM tabla_empleados a
WHERE a.idEmpleado = valor_que_existe;
Todo bien con la consulta de arriba, pero con la siguiente me aparece el error:
SELECT nombre
FROM tabla_empleados a
INTO variable
WHERE a.idEmpleado = valor_que_existe;
Atentamente,
Carlos Caro L.
Carlos, asi a primera vista, tienes un error en el query, intenta poniendo el INTO antes del FROM de manera que quede asi:
SELECT nombre
INTO variable
FROM tabla_empleados a
WHERE a.idEmpleado = valor_que_existe;
eso es lo que yo veo. intenta eso, ojala te funcione.
* Carlos, lo que dice José es correcto, el INTO va luego del SELECT y antes del FROM.
Estiamdos, muchas gracias por la respuestas.
Es solo un error en el ejemplo escrito en el mensje, pero en el procedimiento lo tengo correcto, sino no me compilaria.
Sigo con el problema, si saben algo estare atento, si yo se de algo, publicare la solución.
Estas manejando la excepcion?? citando lo que dices: “Tengo una sentencia SELECT que me arroja una seria de filas como resultado, al agregar la sentencia INTO me aparece el error ORA-0140.”
te refieres a una serie de datos (jose,daniela,maria) o a una serie de registros (jose
daniela
maria)??
si es una serie de registros la excepcion seria TOO_MANY_ROWS y eso es cuando el query regresa mas datos (registros que los soportados en una variable (INTO variable)
si ese es el caso utiliza cursores, en este mismo foro entre los comentarios hay un ejemplo de su uso. ojala te sirva la info, saludos!!
Very helpful, TNKS
Muchas gracias por el tip, me ha sido muy util, que bueno que personas como tu dan ese esfuerzo por compartir un poco de su conocimiento, mil gracias n_n
Un Trackback
[...] ayer también, a través de el modem, leÃa un artÃculo muy sencillo sobre el tÃpico problema de no controlar la posibilidad de que en [...]