Oracleで複数行の挿入を行うための最良の方法は?

Oracle 9データベースに複数行の挿入を行うための良い方法を探しています。 以下の方法はMySQLでは動作しますが、Oracleではサポートされていないようです。

INSERT INTO TMP_DIM_EXCH_RT 
(EXCH_WH_KEY, 
 EXCH_NAT_KEY, 
 EXCH_DATE, EXCH_RATE, 
 FROM_CURCY_CD, 
 TO_CURCY_CD, 
 EXCH_EFF_DATE, 
 EXCH_EFF_END_DATE, 
 EXCH_LAST_UPDATED_DATE) 
VALUES
    (1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
ソリューション

これは、Oracleで動作します。

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

ここで覚えておくべきことは,「from dual」文を使うことです.

(ソース)

解説 (7)

SQL*Loaderを使用します。ちょっとした設定が必要ですが、これが一度きりのことでなければ、その価値はあります。

**テーブルを作成します。

SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>

**CSVを作成する

oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2% 

**ローダーコントロールファイルの作成

oracle-2% cat ldr_test.ctl 
load data

 infile 'ldr_test.csv'
 into table ldr_test
 fields terminated by "," optionally enclosed by '"'              
 ( id, description )

oracle-2% 

*SQLLoaderコマンドの実行**{{5295}}。

oracle-2% sqlldr  control=ldr_test.ctl
Password:

SQL*Loader: Release 9.2.0.5.0 - Production on Wed Sep 3 12:26:46 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Commit point reached - logical record count 3

挿入を確認する

SQL> select * from ldr_test;

        ID DESCRIPTION
---------- --------------------
         1 Apple
         2 Orange
         3 Pear

SQL>

SQL*Loaderには多くのオプションがあり,ほとんど全てのテキストファイルを入力とすることができます。必要であれば,コントロールファイルにデータをインライン化することもできます。

詳細は以下のページをご覧ください -> SQL*Loader.

解説 (4)

挿入したい値がすでに別のテーブルにある場合は、select文からInsertすることができます。

INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;

そうでなければ、単一行のInsert文をたくさん列挙して、いくつかのクエリをまとめて送信することで、OracleとMySQLの両方で動作するものの時間を節約することができます。

@Espo'のソリューションも、データがまだテーブルに入っていない場合は、OracleとMySQLの両方で動作する良いものです。

解説 (0)