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

Разлика между FOR UPDATE OF и FOR UPDATE

От документацията на Oracle :

Ако вашата заявка препраща към една таблица, тогава няма разлика между FOR UPDATE и FOR UPDATE OF ... , но последният все още може да бъде полезен като собствена документация, за да посочи кои колони възнамерявате да актуализирате. Това обаче не ограничава какво можете да актуализирате. Ако имате:

CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;

тогава все още можете да направите:

UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;

Но ако има повече от една таблица, тогава FOR UPDATE OF ... ще заключи само редовете в таблиците, които съдържат колоните, които сте посочили в OF клауза.

Противно на това, което мисля, че казвате във въпроса. като посочите FOR UPDATE OF sal не само заключва sal колона; никога не можете да заключите една колона, минималното заключване е на ниво ред. (Прочетете повече за заключванията ). Той заключва всички редове в таблицата, която съдържа SAL колона, които са избрани от заявката.

В актуализацията на вашия въпрос вашата заявка за курсор се присъединява към emp и dept , но OF клаузата има само sal , колона в emp маса. Редовете в emp таблицата ще бъде заключена, когато курсорът се отвори, и тези заключвания няма да бъдат освободени, докато не commit или rollback тази сесия. В рамките на цикъла на курсора можете да направите:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... за да актуализирате реда в emp таблица, която се отнася до тази итерация на цикъла. Вие не можете направи:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... защото редове в dept таблицата не са заключени, защото няма колони в OF . Това също означава, че във втората ви сесия dept редовете могат да се актуализират свободно, тъй като не са заключени от първата сесия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли начин да се съхранява Unicode текст в база данни на Oracle, конфигурирана като 'US7ASCII'

  2. Показване на съобщения в модалния прозорец във формуляри на Oracle с помощта на Show_Alert

  3. Създаване на JSON и редактиране на сложна заявка (oracle 11g)

  4. Как да направите външно присъединяване на>2 таблици (Oracle)

  5. Търсят се NULL стойности за различен тип Oracle