Oracle
 sql >> Database >  >> RDS >> Oracle

DOVE CORRENTE in PL/SQL

Dai un'occhiata a questo blocco:

DECLARE

    CURSOR c1 IS
    SELECT course_number, ROWID AS RID
    FROM courses_tbl
    FOR UPDATE;

begin

    FOR aCourse IN c1 LOOP

        UPDATE courses_tbl SET course_number = aCourse.course_number + 1 
        WHERE CURRENT OF c1;
        UPDATE courses_tbl SET course_number = aCourse.course_number + 1 
        WHERE ROWID = aCourse.RID

    end loop;

end;

Le due istruzioni UPDATE sono equivalenti, WHERE CURRENT OF ... è solo una scorciatoia per WHERE ROWID = ... , puoi usarne uno qualsiasi.

In realtà la tua domanda dovrebbe essere "Perché abbiamo bisogno di FOR UPDATE ... ?" Il motivo è che il ROWID può cambiare con altre operazioni, ad esempio ALTER TABLE ... SHRINK SPACE , spostando tablespace o grandi DML. FOR UPDATE blocca la riga, ovvero assicura che ROWID non cambi fino al termine della transazione.

No, puoi sbloccare il blocco solo completando la transazione, ovvero ROLLBACK o COMMIT