2017-09-29 7 views
0

私は、PLSQLブロックに以下のFOR LOOPを持っています。それぞれの行をロックするためにFOR UPDATE句を使用したいと思います。しかし、コードを実行すると、背中次の例外を提供します:SELECT .. FOR UPDATEはエラー "DISTINCT、GROUP BYなどでビューからFOR UPDATEを選択できません"

ORA-02014:私はそれを見上げなど、DISTINCT、GROUP BYを持つビューからUPDATE FOR

を選択することはできませんが、正直なところ、私は説明を理解していないので、私は今それを解決することはできません。

誰でもここで何が起こっているのか、その問題を解決する方法を包括的に説明できますか?

EDIR:忘れてしまいましたが、my_tableは表示されません。通常のテーブルです。

+0

エラーメッセージには、表示にDISTINCT、GROUP BYなどが使用されている場合、FOR UPDATEを選択できないことが明示されています。その理由は、このようなビューでは、ビュー内の行と、基礎となる表の行との間に1対1の関係は存在しないためです。したがって、RDBMSは、基礎となる表でどのレコードをロックする必要があるかを認識せず、そうすることを拒否します。 – JimmyB

+0

可能な複製https://stackoverflow.com/questions/3166615/how-to-work-around-ora-02014-cannot-select-for-update-from-view-with-distinct –

+1

お読みください:[最新の情報に更新選択のN行](https://asktom.oracle.com/pls/apex/asktom.search?tag=update-top-n-row-of-a-select) –

答えて

2

エラーが発生している理由はいくつかあります。最初はOracleによってすでに表示されています。

1)DISTINCT、GROUP BYなどのビューではFOR UPDATEを使用できません。テーブルmy_tableがそのようなビューでないかどうかを確認してください。

2)テーブルmy_tableはビューではないため、FOR LOOPでインラインビューを作成しようとすると、Oracleは行をロックすることを拒否します。回避策は以下のようになります。

ここでは、インラインビューを作成するためのテーブルを使用するようにクエリを変更しました。

FOR l_rec IN ( SELECT * 
        FROM my_table 
       WHERE  key_id IN ( SELECT key_id 
              FROM my_table 
             WHERE status = 'NEW' 
             ORDER BY key_id) 
         AND ROWNUM <= i_max 
       FOR UPDATE) 
    LOOP 

    <Do you work>    
+0

既存のサブクエリを追加すると2つ、あなたのアプローチは、ありがとう! (1レベル= FOR UPDATE、2レベル= ROWNUM、3レベル= ORDER BY) – flo

関連する問題