sql >> Database >  >> RDS >> Oracle

WHERE CURRENT OF in PL/SQL

Kijk eens naar dit blok:

DECLARE

    CURSOR c1 IS
    SELECT course_number, ROWID AS RID
    FROM courses_tbl
    FOR UPDATE;

begin

    FOR aCourse IN c1 LOOP

        UPDATE courses_tbl SET course_number = aCourse.course_number + 1 
        WHERE CURRENT OF c1;
        UPDATE courses_tbl SET course_number = aCourse.course_number + 1 
        WHERE ROWID = aCourse.RID

    end loop;

end;

De twee UPDATE-instructies zijn equivalent, WHERE CURRENT OF ... is slechts een snelkoppeling voor WHERE ROWID = ... , je kunt ze allebei gebruiken.

Eigenlijk zou je vraag moeten zijn:"Waarom hebben we FOR UPDATE ... ?" De reden is dat de ROWID kan veranderen door andere bewerkingen, bijv. ALTER TABLE ... SHRINK SPACE , bewegende tablespace of grote DML's. FOR UPDATE vergrendelt de rij, d.w.z. zorgt ervoor dat ROWID niet verandert totdat u uw transactie hebt voltooid.

Nee, u kunt de vergrendeling alleen ontgrendelen door de transactie te voltooien, d.w.z. ROLLBACK of COMMIT



  1. Selecteer Vroegste datum en tijd in de lijst met verschillende gebruikerssessies

  2. SSIS loopt niet parallel met OraOLEDB.Oracle.1 Provider

  3. Moet ik Oracle's UCP of HikariCP gebruiken voor een moderne applicatie?

  4. Een functieaanroep aanroepen in een string in een Oracle Procedure