sql >> Base de Datos >  >> RDS >> Oracle

DONDE CORRIENTE DE en PL/SQL

Echa un vistazo a este bloque:

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;

Las dos sentencias UPDATE son equivalentes, WHERE CURRENT OF ... es solo un atajo para WHERE ROWID = ... , puedes usar cualquiera de ellos.

En realidad, su pregunta debería ser "¿Por qué necesitamos FOR UPDATE ... ?" La razón es que el ROWID puede cambiar por otras operaciones, por ejemplo, ALTER TABLE ... SHRINK SPACE , tablespace móvil o DML grandes. FOR UPDATE bloquea la fila, es decir, asegura que ROWID no cambie hasta que finalice su transacción.

No, solo puede liberar el bloqueo al finalizar la transacción, es decir, ROLLBACK o COMMIT