2012-02-16 11 views
0

特定の条件に基づいてRSをフェッチしてループを開始するとしたら、別の準備済みの文を使用して、このRSの一部であった可能性のあるレコードの挿入または削除を更新する場合があります。結果セットをループしながら更新または挿入すると結果セット自体にどのような影響がありますか?

これはどのように結果セットに影響しますか?私の傾向は、このRSを取り出したステートメントがプロセスの初期に実行されて以来、このRSは準備されたステートメントによる変更に目が見えなくなると考えることです。

擬似コード:

Preapare Statement ps1 
execute ps1 -> get Result Set rs1 
loop through rs1 
    { 
    Update or delete records using other prepared statements 
    } 
+0

あなたの前提は正しいです。 ResultSetオブジェクトはすでに準備されているため、データベースのバックエンドで何が起きているかは関係ありません。 – Kamal

答えて

0

Read Consistency

オラクルステートメントから見たデータのセットが時間的に単一の点に対して一致しており、文の実行中に変化しないことを保証する(文レベルの読取り一貫性)

あなたは、このような

insert into t 
select * from t; 

としてクエリを持っている場合、Oracleは単純に無限ループに入るか、エラーを出さずにすべての行を複製しますなぜ、それはあります。

これには他にも意味があります。

1)Oracleはロールバック・セグメントから読み取って、この読取り一貫性のあるデータ・イメージを提供します。したがって、ロールバック・セグメントが正しくサイズ設定されていない場合や、フェッチ全体にコミットした場合、ロールバック・データはもはや利用できないため、「スナップショットが古すぎます」というエラーが発生します。

この場合、更新中に更新することは可能ですか?私は、カーソルを更新可能にし、結果セットの組み込み関数を使用することとは別に意味します。

2)それぞれのクエリでは、の時点でデータが表示されます。が開始されました。リフレッシュによってクエリの再作成を意味する場合、pl/sql本体でコミットする場合やpl/sqlループ内でコミットする場合や、システム内で他のトランザクションが同時に実行されている場合は、表示されるデータが異なる可能性があります。

0

それはしません。この結果セットのベースとなる行を変更または削除した場合でも、クエリー/カーソルの結果セットはデータベースによって保持されます。あなたは正しいので、ステートメントが実行された後に加えられた変更は盲目的です。

+0

そうです、更新中に更新することは可能ですか? カーソルを更新可能にし、結果セットの組み込み関数を使用するのとは別に、 – angryInsomniac

+0

本当にそうは思いません。しかし、 'bulk collect into'を使用して、その結果をループし、各行を変更することができます。そうすれば結果のメモリ表現を更新することができますが、この場合はデータベース自体で更新されないため、2つを結合する必要があります。もちろん、ステートメントを再度実行することもできますが、それは余分な時間がかかります(クエリに依存します)。行を2回処理したくない場合は、もう一度右の行を検索する必要があります。 – GolezTrol

関連する問題