Oracle
 sql >> база данни >  >> RDS >> Oracle

WHERE CURRENT OF в PL/SQL

Разгледайте този блок:

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;

Двата оператора UPDATE са еквивалентни, WHERE CURRENT OF ... е просто пряк път за WHERE ROWID = ... , можете да използвате всеки от тях.

Всъщност вашият въпрос трябва да бъде „Защо имаме нужда от FOR UPDATE ... ?" Причината е, че ROWID може да се промени чрез други операции, например ALTER TABLE ... SHRINK SPACE , движещи се таблични пространства или големи DML. FOR UPDATE заключва реда, т.е. гарантира, че ROWID няма да се промени, докато не завършите вашата транзакция.

Не, можете да освободите заключването само като завършите транзакцията, т.е. ROLLBACK или COMMIT



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL как да премахнете времето от датата

  2. PHP - oci_connect не е намерен

  3. Вземете текущото местно време на всяка държава в PL/SQL

  4. Oracle непоследователно поведение на производителността на заявката

  5. Oracle PIVOT, два пъти?