Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Różnica między FOR UPDATE OF i FOR UPDATE

Z dokumentacji Oracle :

Jeśli zapytanie odwołuje się do pojedynczej tabeli, nie ma różnicy między FOR UPDATE i FOR UPDATE OF ... , ale ta ostatnia może nadal być przydatna jako samodokumentacja wskazująca, które kolumny zamierzasz zaktualizować. Nie ogranicza jednak tego, co możesz zaktualizować. Jeśli masz:

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

to nadal możesz zrobić:

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

Ale jeśli istnieje więcej niż jedna tabela, to FOR UPDATE OF ... zablokuje tylko wiersze w tabelach, które zawierają kolumny określone w OF klauzula.

Wbrew temu, co myślę, że mówisz w pytaniu. określenie FOR UPDATE OF sal nie tylko blokuje sal kolumna; nigdy nie można zablokować pojedynczej kolumny, minimalna blokada jest na poziomie wiersza. (Przeczytaj więcej o blokadach ). Blokuje wszystkie wiersze w tabeli zawierającej SAL kolumna, które są wybrane przez zapytanie.

W aktualizacji Twojego pytania Twoje zapytanie kursora dołącza do emp i dept , ale OF klauzula ma tylko sal , kolumna w emp stół. Wiersze w emp tabela zostanie zablokowana po otwarciu kursora, a te blokady nie zostaną zwolnione, dopóki nie commit lub rollback tej sesji. W pętli kursora możesz wykonać:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... aby zaktualizować wiersz w emp tabela, która odnosi się do tej iteracji pętli. nie możesz zrobić:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... ponieważ wiersze w dept tabela nie jest zablokowana, ponieważ w OF nie było żadnych kolumn . Oznacza to również, że w drugiej sesji dept wiersze można dowolnie aktualizować, ponieważ nie są blokowane przez pierwszą sesję.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usunąć wszystkie rekordy oprócz ostatniego?

  2. Uruchom, aby wyświetlić wiadomość za pomocą PL/SQL

  3. Jak zamienić lookahead w regex?

  4. Jak mogę uzyskać wczesny dostęp do aktualizacji Oracle Java, abym mógł przetestować moją aplikację RIA i uniknąć prób ogniowych, gdy te aktualizacje zostaną upublicznione?

  5. BEGIN/END i CREATE Table w jednym pliku .sql