Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ONDE CURRENT OF em PL/SQL


Dê uma olhada neste bloco:
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;

As duas instruções UPDATE são equivalentes, WHERE CURRENT OF ... é apenas um atalho para WHERE ROWID = ... , você pode usar qualquer um deles.

Na verdade, sua pergunta deve ser "Por que precisamos de FOR UPDATE ... ?" O motivo é que o ROWID pode ser alterado por outras operações, por exemplo, ALTER TABLE ... SHRINK SPACE , movendo o tablespace ou grandes DMLs. FOR UPDATE bloqueia a linha, ou seja, garante que ROWID não seja alterado até que você termine sua transação.

Não, você pode liberar o bloqueio apenas finalizando a transação, ou seja, ROLLBACK ou COMMIT