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:
- Cursors Implícits: Creats automàticament per Oracle quan s'executa una sentència SQL que retorna un únic resultat.
- 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:
- Declaració del Cursor: Definir el cursor amb una sentència SQL.
- Obertura del Cursor: Executar la sentència SQL associada al cursor.
- Extracció de Dades: Recuperar les files del conjunt de resultats.
- 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'errorNO_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.
Curs de PL/SQL
Mòdul 1: Introducció a PL/SQL
Mòdul 2: Fonaments de PL/SQL
- Estructura del bloc PL/SQL
- Variables i tipus de dades
- Estructures de control
- Cursors
- Gestió d'excepcions