Cómo evitar el error TOO_MANY_ROWS en Oracle PL/SQL
El lenguaje PL/SQL de Oracle cuenta con dos mecanismos básicos para obtener datos de la base de datos: SELECT y cursores. SELECT está diseñado para devolver una sola fila en variables locales; los cursores te brindan la capacidad de seleccionar múltiples filas (es decir, un "conjunto de filas") y procesarlas una por una.
Cuando usas SELECT en un bloque PL/SQL, es importante asegurarte de que exactamente siempre se devolverá una sola fila en tu consulta. Si se devuelve más de una fila, se produce la excepción "TOO_MANY_ROWS". El Listado A muestra un ejemplo del esquema de muestra HR de Oracle: hay más de un empleado con el apellido King, por lo que el script falla.
DECLARE l_employee_last_name employees.last_name%TYPE; l_employee_full_name VARCHAR2(52); BEGIN l_employee_last_name := 'King'; SELECT last_name || ', ' || first_name INTO l_employee_full_name FROM employees WHERE last_name = l_employee_last_name; DBMS_OUTPUT.PUT_LINE (l_employee_full_name); END; /
Existen cuatro formas de asegurarte de que tu código esté protegido contra este error.
Seleccionar filas utilizando la clave primaria
En el Listado A, seleccioné por el apellido (last_name), y es bastante probable que haya más de un empleado con el mismo apellido. Si cambio el código para seleccionar por el employee_id en su lugar, evitaré el error porque solo una fila en una tabla puede tener el mismo valor en la columna(s) de clave primaria.
Utilizar funciones de agregado
Por definición, las funciones de agregado (AVERAGE, COUNT, MIN, MAX y SUM) devuelven solo una fila como resultado. Incluso si la cláusula WHERE no tiene filas coincidentes, un COUNT de esas filas devolverá una fila (el resultado "0"). Seleccionar el MIN o MAX de una tabla se hace con frecuencia de esta manera para determinar los límites de procesamiento.
Limitar la consulta utilizando ROWNUM
Si existe la posibilidad de devolver múltiples filas, pero cualquier fila es igual de útil, intenta agregar la siguiente condición a la consulta: AND ROWNUM < 2. Esto limitará los resultados a la primera fila del conjunto. Pero recuerda que es la primera fila física devuelta: agregar ORDER BY a una consulta con ROWNUM no te dará la fila más alta o más baja, solo la primera.
Cómo instalar y configurar Sybase Adaptive Server Enterprise (ASE) en LinuxPoner el SELECT en su propio bloque
Si envuelves el SELECT con su propio bloque interno, puedes codificar un manejador de excepciones para proporcionar un valor razonable si se produce un error. El Listado B muestra la consulta anterior mejorada de esta manera.
DECLARE l_employee_last_name employees.last_name%TYPE; l_employee_full_name VARCHAR2(52); BEGIN l_employee_last_name := 'King'; BEGIN SELECT last_name || ', ' || first_name INTO l_employee_full_name FROM employees WHERE last_name = l_employee_last_name; EXCEPTION WHEN NO_DATA_FOUND THEN l_employee_full_name := '(no disponible)'; WHEN TOO_MANY_ROWS THEN l_employee_full_name := '(nombre duplicado)'; END; DBMS_OUTPUT.PUT_LINE (l_employee_full_name); END; /
Bob Watkins (OCP, MCITP, MCDBA, MCT) es un profesional de la informática con 25 años de experiencia como instructor técnico, consultor y administrador de bases de datos. Es Consultor Senior y Socio Gerente en B. Watkins, una firma de consultoría y capacitación en bases de datos en el área de Dallas / Fort Worth.
——————————————————————————————
Recibe consejos de Oracle en tu bandeja de entrada
El boletín gratuito de Oracle de Newsmatic, que se envía cada miércoles, cubre la automatización de utilidades de Oracle, la generación de alertas de base de datos, la resolución de problemas de gráficos dirigidos y más. ¡Suscríbete automáticamente hoy mismo!
Qué es sudo y por qué deberías usarloEn Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Gestión de datos, allí encontraras muchos artículos similares a Cómo evitar el error TOO_MANY_ROWS en Oracle PL/SQL , tenemos lo ultimo en tecnología 2023.
Artículos Relacionados