Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Perbedaan antara FOR UPDATE OF dan FOR UPDATE

Dari dokumentasi Oracle :

Jika kueri Anda merujuk pada satu tabel, maka tidak ada perbedaan antara FOR UPDATE dan FOR UPDATE OF ... , tetapi yang terakhir mungkin masih berguna sebagai dokumentasi mandiri untuk menunjukkan kolom mana yang ingin Anda perbarui. Itu tidak membatasi apa yang dapat Anda perbarui. Jika Anda memiliki:

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

maka Anda masih dapat melakukan:

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

Tapi jika ada lebih dari satu tabel maka FOR UPDATE OF ... hanya akan mengunci baris dalam tabel yang berisi kolom yang Anda tentukan di OF klausa.

Bertentangan dengan apa yang saya pikir Anda katakan dalam pertanyaan. menentukan FOR UPDATE OF sal tidak hanya mengunci sal kolom; Anda tidak akan pernah bisa mengunci satu kolom, kunci minimum ada di tingkat baris. (Baca selengkapnya tentang kunci ). Itu mengunci semua baris dalam tabel yang berisi SAL kolom, yang dipilih oleh kueri.

Dalam pembaruan pertanyaan Anda, kueri kursor Anda bergabung dengan emp dan dept , tetapi OF klausa hanya memiliki sal , kolom di emp meja. Baris dalam emp tabel akan dikunci saat kursor dibuka, dan kunci tersebut tidak akan dilepaskan sampai Anda commit atau rollback sesi itu. Dalam lingkaran kursor, Anda dapat melakukan:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... untuk memperbarui baris di emp tabel yang berhubungan dengan iterasi loop ini. Anda tidak bisa lakukan:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... karena baris di dept tabel tidak dikunci, karena tidak ada kolom di OF . Itu juga berarti bahwa dalam sesi kedua Anda dept baris dapat diperbarui secara bebas, karena tidak dikunci pada sesi pertama.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemicu tidak bisa membaca tabel, setelah dipecat oleh tabel yang sama

  2. Natal Datang Lebih Awal (Oracle 12.2)

  3. Pilih ke tabel sementara di Oracle

  4. Catat pesan kesalahan dalam prosedur tersimpan Oracle

  5. pilih baris TOP N dari tabel