1. ホーム
  2. データベース
  3. マイサク

MySQLとOracleの一括挿入SQLの汎用的な記述例

2022-01-06 15:11:02

一例として

ここで、データベースのUSERテーブルにUserオブジェクトを一括して追加したい場合

public class User{
    /    private String name;
    /    private Integer age;
    /    private Integer sex
private}

ほとんどの人はMySQLに慣れているので、バルクの新しいSQLはこのように書かれていると思うかもしれませんが、そうではありません。MySQLではこの書き方で問題ないのですが、Oracleではこの書き方をするとエラーが報告されます。

MySQLは書きます。

INSERT INTO USER 
    (NAME,AGE,SEX)
VALUES
('val1_1', 'val1_2', 'val1_3'),
('val2_1', 'val2_2', 'val2_3'),
('val3_1', 'val3_2', 'val3_3');

オラクルは書き込みます。

// multiple single inserts
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3');
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3');
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3');

//Batch insert
INSERT ALL
   INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3')
SELECT 1 FROM DUAL;

Oracleの2つの書き込み方法はより面倒で、一括挿入も挿入されるカラム名を減らすことができないことがわかります。また、別の問題は、エンタープライズ開発では、ソフトウェアシステムは、複数のデータベースをサポートする必要がある場合がありますので、この新しい操作は、データベースの2つのセットに適応し、SQLの2つのセットを維持する必要があります、これは大幅に開発コストを増加させます。

では、普遍的な書き方はあるのでしょうか?答えは「イエス」です。

一般的な書き方。

INSERT INTO USER (NAME,AGE,SEX)
    select ('val1_1', 'val1_2', 'val1_3') from dual union all
    select ('val2_1', 'val2_2', 'val2_3') from dual union all
    select ('val3_1', 'val3_2', 'val3_3') from dual

これは、1つのSQLセットでシンプルかつメンテナンスが少なくて済むという、両方の長所を兼ね備えています。

以下は、XMLファイルへの様々な書き込み方法のコードです。

<! --MySQL bulk insert-->
<insert id="batchInsertUser" databaseId="mysql">
   INSERT INTO USER 
            (NAME,AGE,SEX)
   VALUES
    <foreach collection="userList" index="index" item="user" separator=",">
            (#{user.name},#{user.age},#{user.sex})
  </foreach>
</insert>

<! -- Oracle's bulk insert -- >
<insert id="batchInsertUser" databaseId="oracle">
  BEGIN
  <foreach collection="userList" index="index" item="user" separator=";">
   INSERT INTO USER 
            (NAME,AGE,SEX)
   VALUES
            (#{user.name},#{user.age},#{user.sex})
  </foreach>
  ;END;
</insert>

MySQLとOracleを見てみると、MySQLはVALUESの直後に複数のデータの挿入をサポートしているので、foreachタグはVALUES()の中身をループすればよいのですが、Oracleはこの方法をサポートしていないので、INSERT文全体をループする必要があることがわかります。

<! --universal batch insert-->
<insert id="batchInsertUser" databaseId="mysql">
   INSERT INTO USER 
            (NAME,AGE,SEX)
  <foreach collection="userList" index="index" item="user" separator="union all">
     SELECT
            (#{user.name},#{user.age},#{user.sex})
     FROM DUAL
  </foreach>
</insert>

概要

MySQLとOracleの一括挿入SQLの一般的な書き方についてのこの記事はこれで終わりです、もっと関連するMySQLとOracleの一括挿入SQLの内容はBinaryDevelopの過去の記事を検索するか次の関連記事を閲覧し続けてください、あなたは将来BinaryDevelopをもっとサポートしてくれることを願っています