En PL/SQL, los cursores son una herramienta fundamental para manejar conjuntos de resultados de consultas SQL. Los cursores permiten a los programadores procesar filas de una consulta de manera individual, lo que es especialmente útil cuando se necesita realizar operaciones fila por fila.
Tipos de Cursores
En PL/SQL, existen dos tipos principales de cursores:
- Cursores Implícitos: Son gestionados automáticamente por Oracle cuando se ejecuta una sentencia SQL que devuelve un solo resultado.
- Cursores Explícitos: Son definidos y gestionados por el programador para manejar consultas que devuelven múltiples filas.
Cursores Implícitos
Los cursores implícitos son creados automáticamente por Oracle para cada sentencia SQL que se ejecuta. No requieren una declaración explícita por parte del programador. Por ejemplo, cuando se ejecuta una sentencia SELECT INTO
, Oracle crea un cursor implícito para manejar la operación.
Ejemplo de Cursor Implícito
DECLARE v_employee_name VARCHAR2(50); BEGIN SELECT first_name INTO v_employee_name FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name); END; /
En este ejemplo, Oracle crea un cursor implícito para la sentencia SELECT INTO
.
Cursores Explícitos
Los cursores explícitos son definidos y controlados por el programador. Se utilizan cuando se necesita procesar múltiples filas de una consulta. Los pasos para trabajar con cursores explícitos son:
- Declarar el Cursor: Definir el cursor con una sentencia
SELECT
. - Abrir el Cursor: Ejecutar la sentencia
SELECT
y asignar el conjunto de resultados al cursor. - Obtener Filas: Recuperar cada fila del conjunto de resultados.
- Cerrar el Cursor: Liberar los recursos asociados con el cursor.
Ejemplo de Cursor Explícito
DECLARE CURSOR emp_cursor IS SELECT employee_id, first_name, last_name FROM employees; v_employee_id employees.employee_id%TYPE; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_employee_id, v_first_name, v_last_name; EXIT WHEN emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Name: ' || v_first_name || ' ' || v_last_name); END LOOP; CLOSE emp_cursor; END; /
En este ejemplo, se declara un cursor emp_cursor
que selecciona employee_id
, first_name
y last_name
de la tabla employees
. Luego, se abre el cursor, se recuperan las filas una por una y se cierran los recursos asociados con el cursor.
Ejercicios Prácticos
Ejercicio 1: Cursor Implícito
Instrucciones: Escribe un bloque PL/SQL que utilice un cursor implícito para seleccionar el nombre de un departamento con department_id
igual a 10 y mostrarlo en la salida.
DECLARE v_department_name VARCHAR2(50); BEGIN SELECT department_name INTO v_department_name FROM departments WHERE department_id = 10; DBMS_OUTPUT.PUT_LINE('Department Name: ' || v_department_name); END; /
Ejercicio 2: Cursor Explícito
Instrucciones: Escribe un bloque PL/SQL que utilice un cursor explícito para seleccionar todos los empleados del departamento 20 y mostrar sus nombres y apellidos.
DECLARE CURSOR dept_emp_cursor IS SELECT first_name, last_name FROM employees WHERE department_id = 20; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN OPEN dept_emp_cursor; LOOP FETCH dept_emp_cursor INTO v_first_name, v_last_name; EXIT WHEN dept_emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_first_name || ' ' || v_last_name); END LOOP; CLOSE dept_emp_cursor; END; /
Errores Comunes y Consejos
- No cerrar el cursor: Siempre asegúrate de cerrar el cursor después de usarlo para liberar los recursos.
- No manejar el caso de
%NOTFOUND
: Asegúrate de usarEXIT WHEN cursor_name%NOTFOUND
para evitar bucles infinitos. - Declarar variables de tipo incorrecto: Utiliza
%TYPE
para declarar variables que coincidan con los tipos de datos de las columnas de la tabla.
Conclusión
Los cursores son una herramienta poderosa en PL/SQL para manejar conjuntos de resultados de consultas SQL. Los cursores implícitos son gestionados automáticamente por Oracle, mientras que los cursores explícitos ofrecen un mayor control al programador. Comprender cómo declarar, abrir, obtener filas y cerrar cursores es esencial para trabajar eficazmente con PL/SQL.
En el próximo tema, exploraremos el manejo de excepciones en PL/SQL, lo que te permitirá gestionar errores y situaciones excepcionales de manera efectiva en tus programas.
Curso de PL/SQL
Módulo 1: Introducción a PL/SQL
Módulo 2: Fundamentos de PL/SQL
- Estructura del Bloque PL/SQL
- Variables y Tipos de Datos
- Estructuras de Control
- Cursores
- Manejo de Excepciones