Oracle
 sql >> Datenbank >  >> RDS >> Oracle

WHERE AKTUELL VON in PL/SQL

Sehen Sie sich diesen Block an:

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;

Die beiden UPDATE-Anweisungen sind äquivalent, WHERE CURRENT OF ... ist nur eine Abkürzung für WHERE ROWID = ... , Sie können beide verwenden.

Eigentlich sollte Ihre Frage lauten "Warum wir FOR UPDATE ... brauchen ?" Der Grund ist, dass sich die ROWID durch andere Operationen ändern kann, z.B. ALTER TABLE ... SHRINK SPACE , beweglicher Tablespace oder große DMLs. FOR UPDATE sperrt die Zeile, d. h. stellt sicher, dass ROWID sich nicht ändert, bis Sie Ihre Transaktion abgeschlossen haben.

Nein, Sie können die Sperre nur aufheben, indem Sie die Transaktion abschließen, d. h. ROLLBACK oder COMMIT