sql >> データベース >  >> RDS >> Oracle

PL/SQLのWHERECURRENTOF

    このブロックを見てください:

    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;
    

    2つのUPDATEステートメントは同等です。WHERE CURRENT OF ... WHERE ROWID = ...の単なるショートカットです 、どちらでも使用できます。

    実際の質問は、「なぜFOR UPDATE ...が必要なのか」ということです。 ?"理由は、ROWIDが他の操作(ALTER TABLE ... SHRINK SPACEなど)によって変更される可能性があるためです。 、テーブルスペースまたは大きなDMLの移動。 FOR UPDATE 行をロックします。つまり、トランザクションが完了するまでROWIDが変更されないようにします。

    いいえ、ロックを解除するには、トランザクションを終了する必要があります。つまり、ROLLBACK またはCOMMIT



    1. Sonar MySQLデータベースにアクセスできません原因:java.sql.SQLException:ユーザー'sonar' @'glassfishdev.ccs.local'のアクセスが拒否されました(パスワードを使用:YES)

    2. 別のテーブルの列データを使用して他のテーブルからデータを取得するにはどうすればよいですか?

    3. パーティションがSQLServer(T-SQL)で圧縮されているかどうかを確認する

    4. SQL Serverで「time」を「smalldatetime」に変換する(T-SQLの例)