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:

  1. Cursores Implícitos: Son gestionados automáticamente por Oracle cuando se ejecuta una sentencia SQL que devuelve un solo resultado.
  2. 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:

  1. Declarar el Cursor: Definir el cursor con una sentencia SELECT.
  2. Abrir el Cursor: Ejecutar la sentencia SELECT y asignar el conjunto de resultados al cursor.
  3. Obtener Filas: Recuperar cada fila del conjunto de resultados.
  4. 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

  1. No cerrar el cursor: Siempre asegúrate de cerrar el cursor después de usarlo para liberar los recursos.
  2. No manejar el caso de %NOTFOUND: Asegúrate de usar EXIT WHEN cursor_name%NOTFOUND para evitar bucles infinitos.
  3. 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.

© Copyright 2024. Todos los derechos reservados