sql >> Databasteknik >  >> RDS >> Oracle

VAR AKTUELL AV i PL/SQL

Ta en titt på detta block:

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;

De två UPDATE-satserna är likvärdiga, WHERE CURRENT OF ... är bara en genväg till WHERE ROWID = ... , du kan använda någon av dem.

Egentligen borde din fråga vara "Varför behöver vi FOR UPDATE ... ?" Anledningen är att ROWID kan ändras av andra operationer, t.ex. ALTER TABLE ... SHRINK SPACE , flytta bordsutrymme eller stora DML:er. FOR UPDATE låser raden, det vill säga säkerställer att ROWID inte ändras förrän du avslutat din transaktion.

Nej, du kan endast släppa låset genom att slutföra transaktionen, dvs. ROLLBACK eller COMMIT



  1. MySQL PDO hur man binder params för IN()

  2. ett bättre tillvägagångssätt än att lagra mysql-lösenord i vanlig text i konfigurationsfil?

  3. Vad är SQL Server? (Definition, versioner, upplagor)

  4. Räknar rader från en underfråga