Este tema resulta de gran importancia para cualquier administrador de bases de datos, debido a que, en PL/SQL, los cursores se usan para el procesamiento de los resultados que se obtienen a través de una consulta, así como también para administrar los registros de una tabla de manera individual. Por su parte, las excepciones también son de gran utilidad para la gestión exitosa de una base de datos, ya que permiten que, a través de un programa, se puedan detectar y procesar los errores que ocurren durante la ejecución de un programa, ayudando de manera directa en la integridad de los datos y en lograr una continuidad óptima de los procesos que se estén ejecutando.

En este tema, aprenderás cómo hacer uso correcto de los cursores y las excepciones en PL/SQL para lograr un adecuado procesamiento de los datos y sabrás manejar las excepciones con el fin de contar con una detección exitosa de errores y poder ejecutar acciones que apoyen en su resolución. Así, desarrollarás soluciones robustas y escalables que permitan a los usuarios contar con información veraz y oportuna para la toma de decisiones.

Explicación

Usando un cursor implícito para leer/escribir información en tablas

En PL/SQL, un cursor es una herramienta utilizada para manejar resultados de una consulta, en una o varias tablas de una base de datos. Básicamente, un cursor es una estructura de control que permite recorrer una tabla, fila por fila, para realizar operaciones con los datos que se van obteniendo (Programación PL/SQL, 2021).

Principalmente, los cursores se utilizan para hacer operaciones complejas que no se pueden llevar a cabo con una única sentencia SQL, o bien, cuando se ejecutan operaciones en los resultados de la consulta, como filtrar datos, realizar cálculos, etc. En resumen, estos recursos permiten realizar operaciones más complejas y específicas sobre los resultados de una consulta en una base de datos.

Según Herrera (2022), en PL/SQL, un cursor implícito se crea automáticamente por el sistema para procesar resultados de una sentencia SQL. Este tipo resulta muy útil para consultas sencillas que devuelven un conjunto de resultados, ya que no es necesario declararlo explícitamente.

Para crear un cursor implícito en PL/SQL, se requiere la cláusula FOR en una sentencia SQL; por ejemplo, si quieres leer y escribir información en la tabla “Employee”, usa esta sentencia:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este caso, el cursor employee_rec se crea automáticamente al utilizar la cláusula FOR con la sentencia SELECT. El cursor itera a través de todas las filas de la tabla “Employee”; además, se puede utilizar para leer y escribir información en cada una de ellas. Dentro del bucle LOOP, se incluye el código necesario para procesar la información de cada fila. Es importante tener en cuenta que los cursores implícitos solo pueden usarse para procesar resultados de una única sentencia SQL.

Imagina que tienes una tabla llamada "Productos", con las siguientes columnas: “id”, “nombre”, “cantidad”, “precio_unitario” y “precio_total”. El siguiente código crea un cursor implícito que recorre la tabla, actualiza el precio total para cada producto y muestra los registros actualizados:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, se utiliza un cursor implícito en un bucle FOR para recorrer la tabla de productos. Para cada registro en el cursor, se actualiza el precio total, multiplicando la cantidad por el precio unitario y añadiendo el resultado en la tabla. Luego, se muestra un mensaje con el nombre del producto y su nuevo precio total.

Este solo es un ejemplo simple de cómo usar un cursor implícito para leer y escribir datos en una tabla en SQL. El uso de cursores y excepciones puede ser más complejo y variar según las necesidades del proyecto.

Usando un cursor para leer/escribir información en tablas

Para utilizar un cursor en SQL, que permita leer y escribir información en una tabla, se deben seguir los siguientes pasos:

  1. Declarar el cursor: se define el cursor y se especifica la consulta que se utilizará para recuperar los datos, por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

  1. Abrir el cursor: se utiliza la instrucción OPEN para abrir el cursor y ejecutar la consulta definida anteriormente, por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

  1. Leer y procesar los datos: se utiliza un bucle FETCH para recorrer los resultados devueltos por la consulta; en él, se pueden realizar operaciones con los datos recuperados, como actualizarlos o insertar nuevos registros en otra tabla, por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

  1. Cerrar el cursor: una vez que se procesaron los datos, se debe cerrar el cursor para liberar los recursos utilizados, por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

El uso de cursores genera un impacto en el rendimiento de la base de datos, especialmente en consultas que devuelven grandes cantidades de información; por tanto, se recomienda utilizarlos con precaución y recurrir a soluciones más eficientes cuando sea posible (Herrera, 2022).

Por ejemplo, imagina que tienes una tabla llamada "Ventas", con las columnas "id_venta", "fecha", "producto" y "cantidad". En este caso, quieres leer los registros almacenados y actualizar la columna "cantidad", multiplicando cada dato por 1.1; luego, deseas que los registros se muestren ya actualizados.

Primero, crea el cursor explícito:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Luego, en el bloque del cursor, utiliza la sentencia FOR UPDATE para bloquear las filas que se actualizarán durante esta acción:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Finalmente, muestra los registros actualizados utilizando una sentencia SELECT:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

Este es solo un ejemplo sencillo de cómo se puede utilizar un cursor explícito en SQL para leer y escribir información en una tabla. Cabe señalar que debes ser precavido con los cursores, ya que pueden afectar el rendimiento de la base de datos si se emplean de manera inadecuada.

Manejo de excepciones para manejo de errores en la programación

El manejo de excepciones en la programación de SQL es una técnica utilizada para controlar y procesar errores que puedan ocurrir durante la ejecución de un programa (IBM, 2021). Una excepción es un evento inesperado que interrumpe la ejecución normal del programa; por ejemplo, una división entre cero, una violación de la integridad de la base de datos o un error de sintaxis.

El manejo de excepciones permite a los desarrolladores gestionar estos errores de forma controlada, así como definir una serie de acciones a seguir cuando se presentan dichas situaciones. Esto puede incluir registrar el error en un archivo, enviar una notificación al administrador del sistema o ejecutar una serie de instrucciones para revertir cualquier acción que haya causado el problema. El manejo de excepciones mejora la confiabilidad y robustez de las aplicaciones, pues evita que los errores provoquen fallos catastróficos en el sistema.

En SQL, el manejo de excepciones se logra mediante el uso de bloques try-catch. En un bloque try, se ingresa el código que puede generar una excepción; por su parte, en uno catch, se especifica el comportamiento que debe tener el programa en caso de que se produzca una excepción. Por ejemplo, se puede determinar que se muestre un mensaje de error al usuario, que se grabe un registro del evento en una tabla o que se intente ejecutar una acción alternativa para solucionar el problema.

A continuación, se presenta un ejemplo de un bloque try-catch, que maneja una excepción de división por cero:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, se intenta realizar una división entre cero, acción que provoca un error; sin embargo, gracias al bloque try-catch, el programa maneja la excepción de manera controlada y muestra un mensaje de error al usuario, en lugar de detenerse abruptamente.

Cabe destacar que, en SQL, existen varias excepciones predefinidas que se pueden administrar gracias a manejo de excepciones. Algunas de las más comunes son estas:

  • NO_DATA_FOUND: esta excepción se muestra cuando una consulta SELECT no devuelve ninguna fila (IBM, 2021), por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, se busca el nombre del producto con un id de 100; si no se encuentra ningún resultado con dicha característica, se lanza la excepción NO_DATA_FOUND y se muestra un mensaje en la consola.

  • TOO_MANY_ROWS: se produce cuando una consulta SELECT devuelve más de una fila (IBM, 2021), por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, se busca el nombre de un producto en la categoría 1; si se encuentra más de un resultado, se lanza la excepción TOO_MANY_ROWS y se muestra un mensaje en la consola.

  • INVALID_NUMBER: se lanza cuando se produce un error al intentar convertir una cadena de caracteres en un número (IBM, 2021), por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, el valor “v_precio” inicia con el valor 'abc', en vez de hacerlo con un número válido. Al intentar realizar la inserción de datos en la tabla “Productos”, se genera la excepción INVALID_NUMBER, ya que se quiere insertar un valor no numérico en la columna “precio”. En el bloque EXCEPTION, se utiliza la instrucción DBMS_OUTPUT.PUT_LINE para imprimir un mensaje de error en la consola de SQL Developer. De esta manera, se maneja la excepción, se captura y se muestra un mensaje de error.

  • DUP_VAL_ON_INDEX: ocurre cuando se intenta añadir un valor duplicado en una columna con una restricción UNIQUE o PRIMARY KEY (IBM, 2021), por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, se quiere insertar un nuevo cliente con un id de 100, pero como ya existe uno con esa identificación, se lanza la excepción DUP_VAL_ON_INDEX y se muestra un mensaje en la consola.

  • OTHERS: se utiliza para capturar cualquier otra excepción no prevista; esto es muy importante porque, además de las excepciones predefinidas, también se pueden personalizar algunas para manejar situaciones específicas de una aplicación (IBM, 2021), por ejemplo:

Esta pantalla se obtuvo directamente del software que se está explicando en la computadora, para fines educativos.

En este ejemplo, se manejan dos excepciones: NO_DATA_FOUND (si no se encuentra ningún producto con el id 100) y OTHERS (para cualquier otro tipo de error). Si se presenta un error diferente al primero, se muestra un mensaje en la consola.

Cabe señalar que se pueden manejar excepciones en combinación con cursores de SQL. De hecho, esto se hace con mucha frecuencia, ya que permite manejar situaciones inesperadas o errores que puedan ocurrir durante la iteración de los resultados del cursor.

Por ejemplo, en un cursor que recorre una tabla y realiza ciertas operaciones en cada fila, se pueden utilizar excepciones para manejar errores como la división por cero, la violación de una restricción de clave foránea, entre otros. En estos casos, el empleo de excepciones ayuda a que el programa maneje estos errores de forma controlada y natural, sin detenerse abruptamente o comprometiendo la integridad de los datos.

Accede al archivo del código del tema, aquí.

Cierre

Conocer la manera correcta de manejar cursores apoya el procesamiento de consultas que impliquen grandes volúmenes de datos y, además, con el manejo correcto de las excepciones, no solamente lograrás encontrar errores fácilmente, sino que también podrás optimizar los procesos de tal forma que puedas garantizar en todo momento el uso de los recursos disponibles. 

La escritura de códigos más eficientes y seguros es una habilidad que todo administrador de bases de datos debe dominar para mejorar el rendimiento en general. Entender el funcionamiento de estos elementos permite crear un código menos complejo y más útil que ayude a garantizar una mayor estabilidad y escalabilidad de las aplicaciones.

Checkpoint

Asegúrate de:

  • Comprender la utilización de las excepciones con el fin de disminuir riesgos de error en el código desarrollado. 
  • Aplicar de manera correcta y eficiente los tipos de cursores existentes en los índices de las bases de datos. 
  • Entender que los cursores y excepciones son fundamentales para un diseño exitoso de consultas de grandes volúmenes de información. 

Referencias bibliográficas

  • Herrera, F. (2022). Cursores PL/SQL. Recuperado de https://bestinbi.es/blog/cursores-pl-sql/
  • IBM. (2021). Manejo de excepciones (PL/SQL). Recuperado de https://www.ibm.com/docs/es/db2/11.5?topic=plsql-exception-handling
  • Programación PL/SQL. (2021). Cursores en PL/SQL. Recuperado de https://www.plsql.biz/2006/12/cursores-en-plsql.html

Tecmilenio no guarda relación alguna con las marcas mencionadas como ejemplo. Las marcas son propiedad de sus titulares conforme a la legislación aplicable, estas se utilizan con fines académicos y didácticos, por lo que no existen fines de lucro, relación publicitaria o de patrocinio.

Los siguientes enlaces son externos a la Universidad Tecmilenio, al acceder a ellos considera que debes apegarte a sus términos y condiciones.

Lecturas

Videos

Para conocer más acerca de cursores en MySQL, te sugerimos revisar lo siguiente: 

Tecmilenio no guarda relación alguna con las marcas mencionadas como ejemplo. Las marcas son propiedad de sus titulares conforme a la legislación aplicable, estas se utilizan con fines académicos y didácticos, por lo que no existen fines de lucro, relación publicitaria o de patrocinio.