sql >> Database teknologi >  >> RDS >> Oracle

Forskellen mellem TIL OPDATERING AF og TIL OPDATERING

Fra Oracle-dokumentationen :

Hvis din forespørgsel refererer til en enkelt tabel, er der ingen forskel mellem FOR UPDATE og FOR UPDATE OF ... , men sidstnævnte kan stadig være nyttig som selvdokumentation for at angive, hvilke kolonner du har tænkt dig at opdatere. Det begrænser dog ikke, hvad du kan opdatere. Hvis du har:

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

så kan du stadig gøre:

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

Men hvis der er mere end én tabel, så FOR UPDATE OF ... vil kun låse rækkerne i tabellerne, der indeholder de kolonner, du angiver i OF klausul.

I modsætning til hvad jeg tror du siger i spørgsmålet. med angivelse af FOR UPDATE OF sal låser ikke kun sal kolonne; du kan aldrig låse en enkelt kolonne, minimumslåsen er på rækkeniveau. (Læs mere om låse ). Den låser alle rækker i tabellen, der indeholder SAL kolonne, som er valgt af forespørgslen.

I opdateringen til dit spørgsmål slutter din markørforespørgsel sig til emp og dept , men OF klausul har kun sal , en kolonne i emp bord. Rækkerne i emp tabellen vil være låst, når markøren åbnes, og disse låse frigives ikke, før du commit eller rollback den session. Inden for din markørløkke kan du gøre:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... for at opdatere rækken i emp tabel, der relaterer til denne iteration af løkken. Du kan ikke gør:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... fordi rækker i dept tabellen er ikke låst, fordi ingen kolonner var i OF . Det betyder også, at dept i din anden session rækker kan opdateres frit, da de ikke er låst ved den første session.



  1. Sådan forbinder du to tabeller med ssp.class.php

  2. Sådan kalder du en lagret procedure og får returværdi i Slick (ved hjælp af Scala)

  3. Maks. sum forespørgsel

  4. MySQL dynamisk link for at hente den rigtige række