質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

9793閲覧

SELECT INSERTを一定件数ごとにコミットしたい

DAIKAN

総合スコア13

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/09/20 06:57

カラム定義が同じTABLE_A、TABLE_Bにおいて、
以下のように、TABLE_Bから特定のレコードをTABLE_AにSELECT INSERTしたいです。

INSERT INTO TABLE_A
SELECT * from TABLE_B
WHERE 更新日時 >= 〇〇 and 更新日時 ××;

COMMIT;

この時、SQLの実行に時間がかかるため、
UNDO表領域が足りなくならないよう、一定件数ずつコミットするようにしたいです。

インターネット上を検索しても、やりたいことを実現できる方法を探せていないのですが、
何か良い方法はありませんでしょうか?

Oracle Database 11g を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

時間とディスクを使っても良いのであれば ですが
SPOOLでディスクに吐き出してからLoaderで一定件数毎にコミットしながら流し込んだらいかがでしょう?

セキュリティなど問題もありますし準備は手間ですがやりたいことはできるかと。。。

投稿2018/09/20 10:12

Satsuki_2981

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のようなSQLを元に分割する境界のキーを求めて、そのキーを範囲に分割するようにします。
※条件が一意になるものとは限らないので、厳密な件数とするには一意キーを指定するしかありません。

SQL

1select * from ( 2 SELECT row_number() over(order by キー) as line,キー 3 from TABLE_B 4 WHERE 抽出条件 5) temp 6where mod(line, 分割件数)=0

上記を元にフェッチループ内で以下のように分割します。

SQL

1INSERT INTO TABLE_A 2SELECT * from TABLE_B 3WHERE キー between 分割キー開始 and 分割キー終了 4 and 抽出条件 5; 6COMMIT;

※尚、分割の最終(全件でも分割件数に満たない場合も含む)では分割キー終了は指定せず、分割キー開始以降という処理になります。

投稿2018/09/20 08:58

編集2018/09/20 12:42
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何件くらいのテーブルでしょうか?UNDOのサイズは?
LOBなど極端に容量が必要なカラムがない限り通常は数千万件くらいの INSERT ... SELECT できるくらいのハードウェアは用意しておくはずです。

インラインビューでROW_NUMBER 更新日時 順にデータを並べて、一定件数毎にCOMMITする目安を付けて、INSERT ... SELECT ... WHERE 更新日時 BETWEEN 開始日時 AND 終了日時 を実行します。

スナップショットが古すぎます。

というエラーを避けるために
UNDO_RETENTION だけは INSERT ... SELECT に必要な時間を確保します。

投稿2018/09/20 08:08

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問