[Oracle] PL/SQL: Update di righe tramite Cursore

Rispondi
Roberto
Amministratore
Messaggi: 160
Iscritto il: 19/12/2009, 19:30

[Oracle] PL/SQL: Update di righe tramite Cursore

Messaggio da Roberto »

Creiamo un cursore su cui eseguiamo una query che ci restituisce tutti i dipendenti afferenti ad un'Area specifica:

Codice: Seleziona tutto

CURSOR dip_area IS
	SELECT *
	FROM dipendente
	WHERE area = &id_area
	FOR UPDATE;
vogliamo a questo punto sfogliare con un LOOP le righe ricevute e incrementare di 1 il livello del contratto dei dipendenti restituiti dalla query precedente:

Codice: Seleziona tutto

FOR dip_record IN dip_area LOOP
	UPDATE dipendente
	SET livello_contratto = livello_contratto + 1
	WHERE CURRENT OF dip_area;
END LOOP;
Abbiamo utilizzato la clausola WHERE CURRENT OF per effettuare l'update nella tabella "dipendente" della riga corrispondente a quella corrente di "dip_area" nel LOOP e la clausola FOR UPDATE per bloccare le righe lette dal cursore e che devono essere modificate. Il blocco delle righe serve ad impedire che nessuno possa modificare i dati delle righe fino a quendo non abbiamo terminato le nostre operazioni.

Il codice completo del blocco e':

Codice: Seleziona tutto

DECLARE
    CURSOR dip_area IS
        SELECT *
        FROM dipendente
        WHERE area = &id_area
        FOR UPDATE;
    dip_record dip_area%ROWTYPE;
    
BEGIN

    FOR dip_record IN dip_area LOOP
        DBMS_OUTPUT.PUT_LINE('Il vecchio livello e'': ' || dip_record.livello_contratto);
        
        UPDATE dipendente
        SET livello_contratto = livello_contratto + 1
        WHERE CURRENT OF dip_area;
    END LOOP;
    
    FOR dip_record IN dip_area LOOP
        DBMS_OUTPUT.PUT_LINE('Il nuovo livello e'': ' || dip_record.livello_contratto);
    END LOOP;
END;
Roberto Basile
Rispondi