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
SELECTy 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%NOTFOUNDpara evitar bucles infinitos. - Declarar variables de tipo incorrecto: Utiliza
%TYPEpara 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
