CURSORI ESPLICITI – modifica di tabelle

Nel precedente articolo (panoramica sui cursori) abbiamo visto qualche semplice esempio con statement SQL.
E’ anche possibile utilizzare i cursori per modifiche a tabelle del database.
Se vogliamo utilizzare i cursori espliciti per effettuare update o delete dei dati, abbiamo bisogno di:
-dichiarare il cursore con la clausola FOR UPDATE (per evitare modifiche non volute da parte di altri).
-utilizzare la clausola WHERE CURRENT OF per modificare le righe interessate dalla FETCH.
La clausola FOR UPDATE determina un lock a livello di riga sui dati, in modo da evitare modifiche al dato prima di eseguire lo statement di delete o update.
La sintassi FOR UPDATE è la seguente:
DECLARE
CURSOR cur_name IS
SELECT […colonne…]
FROM […tabelle…]
WHERE […condizioni…]
FOR UPDATE OF […colonne su cui effettuare il lock, quando si usano più tabelle …];
oppure:
DECLARE
CURSOR cur_name IS
SELECT […colonne…]
FROM […tabelle…]
WHERE […condizioni…]
FOR UPDATE;
————————————————————————————————————————
ESEMPI
esempio 1 – cursore esplicito, delete
DECLARE
var_firstname VARCHAR(20);
var_lastname VARCHAR(20);
var_salary people.salary%TYPE;
CURSOR cur_person IS
SELECT first_name, last_name, salary
FROM people
FOR UPDATE;
BEGIN
OPEN cur_person;
LOOP
FETCH cur_person INTO var_firstname, var_lastname, var_salary;
EXIT WHEN cur_person%NOTFOUND;
IF var_salary > 3000 THEN
DELETE people WHERE CURRENT OF cur_person;
END IF;
END LOOP;
CLOSE cur_person;
END;
/
esempio 2 – cursore esplicito, update
DECLARE
var_firstname VARCHAR(20);
var_lastname VARCHAR(20);
var_salary people.salary%TYPE;
CURSOR cur_person IS
SELECT first_name, last_name, salary
FROM people
FOR UPDATE;
BEGIN
OPEN cur_person;
LOOP
FETCH cur_person INTO var_firstname, var_lastname, var_salary;
EXIT WHEN cur_person%NOTFOUND;
IF var_salary > 3000 THEN
UPDATE people SET salary = 3000
WHERE CURRENT OF cur_person;
END IF;
END LOOP;
CLOSE cur_person;
END;
/

Potrebbero interessarti anche...