Els cursors en PL/SQL són eines que permeten als programadors gestionar i manipular conjunts de resultats de consultes SQL. Els cursors són essencials per treballar amb dades fila per fila, especialment quan es necessita processar cada fila individualment.

Tipus de Cursors

Hi ha dos tipus principals de cursors en PL/SQL:

  1. Cursors Implícits: Creats automàticament per Oracle quan s'executa una sentència SQL que retorna un únic resultat.
  2. Cursors Explícits: Definits pel programador per gestionar consultes que retornen múltiples files.

Cursors Implícits

Els cursors implícits són creats automàticament per Oracle per a sentències SQL com SELECT INTO, INSERT, UPDATE, i DELETE. No requereixen una declaració explícita per part del programador.

Exemple de Cursor Implícit

DECLARE
    v_emp_name VARCHAR2(50);
BEGIN
    SELECT first_name INTO v_emp_name
    FROM employees
    WHERE employee_id = 100;
    
    DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name);
END;
/

Cursors Explícits

Els cursors explícits són definits pel programador i proporcionen un control més gran sobre el processament de conjunts de resultats. Els cursors explícits segueixen quatre passos principals:

  1. Declaració del Cursor: Definir el cursor amb una sentència SQL.
  2. Obertura del Cursor: Executar la sentència SQL associada al cursor.
  3. Extracció de Dades: Recuperar les files del conjunt de resultats.
  4. Tancament del Cursor: Alliberar els recursos associats amb el cursor.

Exemple de Cursor Explícit

DECLARE
    CURSOR emp_cursor IS
        SELECT employee_id, first_name, last_name
        FROM employees;
    
    v_emp_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_emp_id, v_first_name, v_last_name;
        EXIT WHEN emp_cursor%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_first_name || ' ' || v_last_name);
    END LOOP;
    
    CLOSE emp_cursor;
END;
/

Paràmetres de Cursors

Els cursors explícits poden acceptar paràmetres, permetent així una major flexibilitat en les consultes.

Exemple de Cursor amb Paràmetres

DECLARE
    CURSOR emp_cursor (p_department_id NUMBER) IS
        SELECT employee_id, first_name, last_name
        FROM employees
        WHERE department_id = p_department_id;
    
    v_emp_id employees.employee_id%TYPE;
    v_first_name employees.first_name%TYPE;
    v_last_name employees.last_name%TYPE;
BEGIN
    OPEN emp_cursor(10); -- Passar el valor del paràmetre
    
    LOOP
        FETCH emp_cursor INTO v_emp_id, v_first_name, v_last_name;
        EXIT WHEN emp_cursor%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE('ID: ' || v_emp_id || ', Name: ' || v_first_name || ' ' || v_last_name);
    END LOOP;
    
    CLOSE emp_cursor;
END;
/

Exercicis Pràctics

Exercici 1: Crear un Cursor Explícit

Descripció: Crea un cursor explícit que seleccioni tots els empleats del departament 20 i imprimeixi els seus noms i salaris.

Solució:

DECLARE
    CURSOR dept_cursor IS
        SELECT first_name, salary
        FROM employees
        WHERE department_id = 20;
    
    v_first_name employees.first_name%TYPE;
    v_salary employees.salary%TYPE;
BEGIN
    OPEN dept_cursor;
    
    LOOP
        FETCH dept_cursor INTO v_first_name, v_salary;
        EXIT WHEN dept_cursor%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE('Name: ' || v_first_name || ', Salary: ' || v_salary);
    END LOOP;
    
    CLOSE dept_cursor;
END;
/

Exercici 2: Cursor amb Paràmetres

Descripció: Crea un cursor amb un paràmetre que accepti un job_id i imprimeixi els noms i salaris dels empleats amb aquest job_id.

Solució:

DECLARE
    CURSOR job_cursor (p_job_id VARCHAR2) IS
        SELECT first_name, salary
        FROM employees
        WHERE job_id = p_job_id;
    
    v_first_name employees.first_name%TYPE;
    v_salary employees.salary%TYPE;
BEGIN
    OPEN job_cursor('IT_PROG'); -- Passar el valor del paràmetre
    
    LOOP
        FETCH job_cursor INTO v_first_name, v_salary;
        EXIT WHEN job_cursor%NOTFOUND;
        
        DBMS_OUTPUT.PUT_LINE('Name: ' || v_first_name || ', Salary: ' || v_salary);
    END LOOP;
    
    CLOSE job_cursor;
END;
/

Errors Comuns i Consells

  • Oblidar tancar el cursor: Sempre assegura't de tancar el cursor després d'usar-lo per alliberar els recursos.
  • No gestionar l'error NO_DATA_FOUND: Quan utilitzes cursors implícits, assegura't de gestionar l'error NO_DATA_FOUND per evitar excepcions inesperades.
  • Utilitzar cursors quan no és necessari: Si només necessites una única fila, considera utilitzar una sentència SELECT INTO en lloc d'un cursor.

Conclusió

Els cursors són una eina poderosa en PL/SQL per gestionar conjunts de resultats de consultes SQL. Els cursors implícits són útils per a operacions simples, mentre que els cursors explícits proporcionen un control més gran i flexibilitat. Amb la pràctica, els programadors poden utilitzar cursors per optimitzar i gestionar eficientment les seves aplicacions PL/SQL.

© Copyright 2024. Tots els drets reservats