私はしばらく探していましたが、これを見つけることができませんでした。私は Oracle を使用しており、次のような For ループがあります。
BEGIN
FOR YEARIDs IN (SELECT DISTINCT YEARID From MyTable)
LOOP
UPDATE (
SELECT ......
)
SET MyFlag = 1;
COMMIT; -- Added
END LOOP;
END;
AutoCommit がオンになっていますが、FOR ループ全体が完了するまでコミットは行われないようです。したがって、上記のコードに Commit ステートメントを追加しました。これにより予期しない結果が生じるのでしょうか、それともベスト プラクティスに違反しますか? (つまり、AutoCommit がオンになっている場合、commit を明示的に呼び出してはいけませんか?)
ありがとう、スコット
編集: おっと... Oracle 11g と Oracle SQL Developer をクライアントとして使用しています。
編集: これまでのところ、ご回答いただきありがとうございます。クエリが実行されている時点で、データが生成および調整されています。他の接続がデータへのアクセスを試みてはなりません。なぜ頻繁にコミットするのかというと、開発中にデータのサブセットに対してクエリを実行すると、クエリは問題なく実行されます。テーブルには約 1,400 万件のレコードがあり、約 100k に対してテストしています。クエリはかなり複雑で、このサブセットに対して約 5 分で実行されます。テーブル全体に対して実行するように移動すると、クエリは 14 時間以上実行され、レコードの更新に失敗します。私の理論では、これほど多くの元に戻す情報を保持すると、開発サーバーで使用可能なすべてのリソースが消費される可能性があります。また、コミットを頻繁に行うと、元に戻す情報を解放して再利用できます。はい、遅いです。しかし、一晩中かかってもクエリが実際に完了する場合は、テスト サーバーに移動できます。(そして、パフォーマンス チューニングは後日行うことができます。) この締め切りはとうの昔に過ぎています。(締め切りに間に合わなかったので手伝いに連れてこられました。私の専門分野はオラクルではありません。)