sql >> Database teknologi >  >> RDS >> Oracle

HVOR AKTUEL AF i PL/SQL

Tag et kig på denne 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;

De to UPDATE-sætninger er ækvivalente, WHERE CURRENT OF ... er blot en genvej til WHERE ROWID = ... , kan du bruge en af ​​dem.

Faktisk burde dit spørgsmål være "Hvorfor skal vi bruge FOR UPDATE ... ?" Årsagen er, at ROWID kan ændres ved andre operationer, f.eks. ALTER TABLE ... SHRINK SPACE , flytte tablespace eller store DML'er. FOR UPDATE låser rækken, dvs. sikrer, at ROWID ikke ændres, før du har afsluttet din transaktion.

Nej, du kan kun frigøre låsen ved at afslutte transaktionen, dvs. ROLLBACK eller COMMIT



  1. Formatering af et PHP-array til en SQL IN-klausul

  2. Gruppér efter ID undtagen NULL-posterne

  3. Indsæt i databaseproblem... (Dårlig tegnkodning) PHP/MYSQL

  4. At få en procentdel fra MySql med en gruppe efter tilstand og præcision