sql >> Databáze >  >> RDS >> Oracle

WHERE Current OF v PL/SQL

Podívejte se na tento blok:

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;

Dva příkazy UPDATE jsou ekvivalentní, WHERE CURRENT OF ... je pouze zkratka pro WHERE ROWID = ... , můžete použít kterýkoli z nich.

Ve skutečnosti by vaše otázka měla znít „Proč potřebujeme FOR UPDATE ... ?" Důvodem je, že ROWID se může změnit jinými operacemi, např. ALTER TABLE ... SHRINK SPACE , přesunutí tabulkového prostoru nebo velkých DML. FOR UPDATE uzamkne řádek, tj. zajistí, že se ROWID nezmění, dokud nedokončíte transakci.

Ne, zámek můžete uvolnit pouze dokončením transakce, tj. ROLLBACK nebo COMMIT



  1. MYSQL Jak provést vlastní měsíční rozdíl mezi dvěma daty v MYSQL?

  2. MYSQL count of count?

  3. Seskupte výstup ZOBRAZIT SLOUPCE do seznamu odděleného čárkami

  4. MariaDb nepodporuje funkci ANY_VALUE().