Oracle
 sql >> Base de données >  >> RDS >> Oracle

WHERE CURRENT OF en PL/SQL

Jetez un œil à ce bloc :

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;

Les deux instructions UPDATE sont équivalentes, WHERE CURRENT OF ... est juste un raccourci pour WHERE ROWID = ... , vous pouvez utiliser l'un ou l'autre.

En fait, votre question devrait être "Pourquoi avons-nous besoin de FOR UPDATE ... ?" La raison en est que le ROWID peut changer par d'autres opérations, par exemple ALTER TABLE ... SHRINK SPACE , tablespace mobile ou grands DML. FOR UPDATE verrouille la ligne, c'est-à-dire garantit que ROWID ne change pas tant que vous n'avez pas terminé votre transaction.

Non, vous ne pouvez libérer le verrou qu'en terminant la transaction, c'est-à-dire ROLLBACK ou COMMIT