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.

Índice de Contenido
  1. Seleccionar filas utilizando la clave primaria
  2. Utilizar funciones de agregado
  3. Limitar la consulta utilizando ROWNUM
  4. Poner el SELECT en su propio bloque

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 Linux

Poner 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 usarlo

En 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

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.