En este tema, aprenderemos sobre los cursores en PL/SQL, una herramienta fundamental para manejar conjuntos de resultados de consultas SQL. Los cursores pueden ser implícitos o explícitos, y cada tipo tiene sus propias características y usos.
¿Qué es un Cursor?
Un cursor es un mecanismo que permite a las aplicaciones PL/SQL procesar filas de una consulta SQL de manera individual. Los cursores son esenciales cuando se necesita trabajar con múltiples filas de datos, ya que permiten recorrer y manipular cada fila de manera controlada.
Cursores Implícitos
Los cursores implícitos son gestionados automáticamente por Oracle cuando se ejecuta una sentencia SQL que devuelve un conjunto de resultados. No requieren una declaración explícita por parte del programador.
Características de los Cursores Implícitos:
- Son creados automáticamente por Oracle.
- Se utilizan principalmente para sentencias
INSERT
,UPDATE
,DELETE
ySELECT INTO
. - No requieren una declaración explícita ni un manejo explícito de apertura o cierre.
Ejemplo de Cursor Implícito:
DECLARE v_total_employees NUMBER; BEGIN -- El cursor implícito se crea y gestiona automáticamente SELECT COUNT(*) INTO v_total_employees FROM employees; DBMS_OUTPUT.PUT_LINE('Total Employees: ' || v_total_employees); END; /
En este ejemplo, el cursor implícito se utiliza para contar el número de empleados en la tabla employees
.
Cursores Explícitos
Los cursores explícitos son definidos y gestionados por el programador. Se utilizan cuando se necesita un control más fino sobre el procesamiento de filas de una consulta.
Características de los Cursores Explícitos:
- Deben ser declarados explícitamente en el bloque PL/SQL.
- Requieren operaciones explícitas de apertura (
OPEN
), recuperación (FETCH
) y cierre (CLOSE
). - Permiten un control detallado sobre el procesamiento de cada fila.
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 explícito 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 al final.
Comparación entre Cursores Implícitos y Explícitos
Característica | Cursores Implícitos | Cursores Explícitos |
---|---|---|
Declaración | Automática | Explícita |
Gestión | Automática | Manual (OPEN, FETCH, CLOSE) |
Uso Principal | Sentencias INSERT , UPDATE , DELETE , SELECT INTO |
Consultas que requieren procesamiento fila por fila |
Control sobre Filas | Limitado | Completo |
Complejidad | Baja | Alta |
Ejercicio Práctico
Ejercicio 1: Uso de Cursor Implícito
Escribe un bloque PL/SQL que utilice un cursor implícito para calcular el salario promedio de los empleados en la tabla employees
.
Solución:
DECLARE v_avg_salary NUMBER; BEGIN SELECT AVG(salary) INTO v_avg_salary FROM employees; DBMS_OUTPUT.PUT_LINE('Average Salary: ' || v_avg_salary); END; /
Ejercicio 2: Uso de Cursor Explícito
Escribe un bloque PL/SQL que utilice un cursor explícito para listar los nombres y salarios de los empleados cuyo salario es mayor a 5000.
Solución:
DECLARE CURSOR high_salary_cursor IS SELECT first_name, last_name, salary FROM employees WHERE salary > 5000; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; v_salary employees.salary%TYPE; BEGIN OPEN high_salary_cursor; LOOP FETCH high_salary_cursor INTO v_first_name, v_last_name, v_salary; EXIT WHEN high_salary_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Name: ' || v_first_name || ' ' || v_last_name || ', Salary: ' || v_salary); END LOOP; CLOSE high_salary_cursor; END; /
Conclusión
En esta sección, hemos aprendido sobre los cursores implícitos y explícitos en PL/SQL. Los cursores implícitos son gestionados automáticamente por Oracle y son útiles para operaciones simples, mientras que los cursores explícitos proporcionan un control detallado sobre el procesamiento de filas y son necesarios para operaciones más complejas. Con esta base, estarás preparado para manejar conjuntos de resultados de manera eficiente en tus aplicaciones PL/SQL.
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