2013年2月2日土曜日

[Oracle]multi insert

multi insertをつかうと、1つのSQL文で複数テーブルに一括でデータ登録ができるようになります。
これにより、各テーブルに対してinsertする時と比べてトラフィックが削減できパフォーマンス向上が見込めるのではないかと思います。

例1

各テーブルに対して値を指定して挿入
  1  insert all
  2  into test1 (id, name) values (1, 'name1')
  3  into test2 (id, name) values (1, 'name2')
  4* select * from dual

2 rows created.

JDBCを使用した場合は、バインド変数を使用して挿入する値を埋め込んであげると良い。
        PreparedStatement statement = connection.prepareStatement("INSERT ALL"
                + " INTO test1 VALUES (?, ?)"
                + " INTO test2 VALUES (?, ?)"
                + " SELECT * FROM dual");
        statement.setInt(1, 1);
        statement.setString(2, "あいうえお");
        statement.setInt(3, 1);
        statement.setString(4, "かきくけこ");
        int count = statement.executeUpdate();

例2

副問い合わせの結果に応じてinsert先テーブルを切り替えるにはwhen句と組み合わせると良い。
  1  insert all
  2  when mod(id, 2) = 0 then
  3    into test1
  4  else
  5    into test2
  6* select id, name from test3

5 rows created.