ORA-01403 No data found

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:

PLSQL:
  1. BEGIN /*Inicio del script o del procedimiento*/
  2.    --Líneas de Código
  3.    (...)
  4.    SELECT nombre
  5.       INTO variable
  6.      FROM tabla_empleados a
  7.    WHERE a.idEmpleado = valor_que_no_existe;
  8.    (...)
  9.    --Continuación del script
  10. END; /*Fin del script o del procedimiento*/

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

PLSQL:
  1. BEGIN /*Inicio del script o del procedimiento*/
  2.    --Líneas de Código
  3.    (...)
  4.    BEGIN /*Inicio del bloque donde está el query que puede no devolver ninguna fila*/
  5.       SELECT nombre
  6.          INTO variable
  7.         FROM tabla_empleados a
  8.       WHERE a.idEmpleado = valor_que_no_existe;
  9.          variable := NULL;
  10.    END; /*Fin del bloque donde está el query que puede no devolver ninguna fila*/
  11.    (...)
  12.    --Continuación del script
  13.       --Código para manejar otras excepciones
  14. 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

  1. Rubén
    Comentado febrero 14, 2008 a las 3:11 am | Permalink

    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*/

  2. Comentado febrero 16, 2008 a las 3:49 pm | Permalink

    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.

  3. Marco
    Comentado noviembre 25, 2008 a las 7:40 pm | Permalink

    Muy buena tu publicacion sobre este error, y esta es muy clara la forma que la explicaste.

    Gracias.

    Saludos,

  4. angelica
    Comentado enero 7, 2009 a las 11:43 am | Permalink

    Muy buen comentario!!! me quedo super claro!

  5. JORGE
    Comentado abril 7, 2009 a las 1:56 pm | Permalink

    Muy buena referencia, fue de mucha ayuda. esta muy claro

  6. IVAN
    Comentado junio 3, 2009 a las 1:09 pm | Permalink

    gracias por la aclaración… ya estaba por arrancarme los pelos…

    saludos desde Panamá

  7. Jhoher
    Comentado junio 22, 2009 a las 3:59 pm | Permalink

    Saludos, desde Caracas, Venezuela.

    Buena Publicación!

  8. Comentado junio 30, 2009 a las 6:32 pm | Permalink

    Me salvó de un artificio muy largo.
    Saludos desde Peru.

  9. Adrian
    Comentado julio 1, 2009 a las 9:16 pm | Permalink

    Gracias por sacarme de una buen apuro te felicito te explicas a la perfeccion.

  10. Hans
    Comentado agosto 6, 2009 a las 8:51 am | Permalink

    Esta muy claro, gracias por el apoyo.

    Slds desde Lima Perú

  11. andres
    Comentado octubre 13, 2009 a las 12:43 pm | Permalink

    este error tambien se da, si envias el foco a un campo que es de solo visualizacion, esto cuando trabajas en varias ventanas.

  12. Gustavo Barraza
    Comentado noviembre 6, 2009 a las 10:27 am | Permalink

    Excelente!!! gracias por el aporte..

    Saludos desde Chile.

  13. dibeka
    Comentado diciembre 23, 2009 a las 3:05 am | Permalink

    ¿este error es posible al realizar “select 1 from dual”?

  14. Comentado diciembre 23, 2009 a las 10:12 am | Permalink

    Dibeka,

    select 1 from dual da “1″. No creo que origine el NO DATA FOUND

  15. Adriana
    Comentado abril 5, 2010 a las 6:55 pm | Permalink

    Gracias!!
    Me habría evitado unas horas de estrés, si hubiése recurrido antes a San Google!

    Muy buen aporte.

  16. Angelica
    Comentado abril 7, 2010 a las 10:33 am | Permalink

    Demasiado Bueno Gracias… Slds des Costa Rica

  17. Jose A. Larios
    Comentado abril 22, 2010 a las 11:19 am | Permalink

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

  18. Jose A. Larios
    Comentado abril 22, 2010 a las 11:23 am | Permalink

    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.

  19. Jose A. Larios
    Comentado abril 22, 2010 a las 11:32 am | Permalink

    olvidenlo, ya quedo jejeje fue un error en los parentesis del primer to_char :D . saludos!!

  20. Comentado abril 29, 2010 a las 10:17 pm | Permalink

    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.

  21. Jose A. Larios
    Comentado abril 30, 2010 a las 10:42 am | Permalink

    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.

  22. Comentado abril 30, 2010 a las 11:07 am | Permalink

    * Carlos, lo que dice José es correcto, el INTO va luego del SELECT y antes del FROM.

  23. Comentado abril 30, 2010 a las 4:42 pm | Permalink

    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.

  24. Jose A. Larios
    Comentado abril 30, 2010 a las 4:55 pm | Permalink

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

  25. Mauricio
    Comentado abril 25, 2011 a las 10:18 pm | Permalink

    Very helpful, TNKS

  26. Comentado mayo 11, 2011 a las 2:14 pm | Permalink

    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

  1. [...] 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 [...]

CC 2009 El Módem. Some rights reserved.