sql >> Databasteknik >  >> RDS >> Oracle

Skillnaden mellan FÖR UPPDATERING AV och FÖR UPPDATERING

Från Oracle-dokumentationen :

Om din fråga refererar till en enskild tabell är det ingen skillnad mellan FOR UPDATE och FOR UPDATE OF ... , men den senare kan fortfarande vara användbar som självdokumentation för att indikera vilka kolumner du tänker uppdatera. Det begränsar dock inte vad du kan uppdatera. Om du har:

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

då kan du fortfarande göra:

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

Men om det finns mer än en tabell så FOR UPDATE OF ... kommer endast att låsa raderna i tabellerna som innehåller kolumnerna du anger i OF klausul.

Tvärtemot vad jag tror att du säger i frågan. anger FOR UPDATE OF sal låser inte bara sal kolumn; du kan aldrig låsa en enda kolumn, det lägsta låset är på radnivå. (Läs mer om lås ). Den låser alla rader i tabellen som innehåller SAL kolumn, som väljs av frågan.

I uppdateringen av din fråga ansluter din markörfråga till emp och dept , men OF klausulen har bara sal , en kolumn i emp tabell. Raderna i emp tabell kommer att låsas när markören öppnas, och dessa lås kommer inte att släppas förrän du commit eller rollback den sessionen. Inom markörslingan kan du göra:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... för att uppdatera raden i emp tabell som relaterar till denna iteration av slingan. Du kan inte gör:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... eftersom rader i dept Tabellen är inte låst eftersom inga kolumner fanns i OF . Det betyder också att dept i din andra session rader kan uppdateras fritt, eftersom de inte är låsta av den första sessionen.



  1. Exportera data från SQL Server till Excel och textfil via SSIS-paketet

  2. Uppföljare:Förälder med minst ett barn

  3. MySQL:Transaktioner vs låsningstabeller

  4. Ladda upp ett Excel-ark och importera data till SQL Server-databas