2016-07-15 5 views
0

独自のINSERTをサポートするインメモリデータベースに:今すべてのOracle構文

select * from FOO foo where foo.id IN (ids) 

idsは、およそ7000残念ながら、Oracleの文字列の大規模なコレクションですIN節には1000要素の制限があります。

これを克服するために、私は次のいずれかです。 私はそれも動作するかどうかはわからないと私は本当にそれが一時的な

  • 使用も行い疑う:それはなるように

    1. は、動的にクエリを連結テーブルを開き、クエリをselect * from FOO foo join SOME_TEMPORARY_ID tempids on foo.id = tempids.idに書き換えます。

    私は2つのオプションのために行くことに決めました。問合せを実行する前に、Oracleに効率的なバッチ・インサートをどうにかして実行する必要があります。残念ながら、Oracleはバッチ挿入を行うために独自の構文があります。今すぐ

    INSERT ALL 
    INTO some_table VALUES ('foo') 
    INTO some_table VALUES ('foo1') 
    INTO some_table VALUES ('foo2') 
    .... 
    INTO some_table VALUES ('foo12345') 
    SELECT * FROM DUAL 
    

    、私は言及しなかったが、私は、このための統合テストを書きたい、理想的にH2や他のインメモリデータベースを使用します。 もちろん、H2はその構文をサポートしていません。 HSQLDBもどちらもしません。

    独自のOracle構文を完全にサポートするメモリ内のデータベースを知っていますか?または少なくともこの特定の1つのINSERT ALL節?

  • 答えて

    2

    あなたの主な問題を説明していただきありがとうございます。 チェックが、これはこの単純な回避策は制限がない持っています

    where (foo.id, 0) in (('1', 0), ('2', 0),...) 
    

    を助けることができるかもしれません。この答えが適切でない場合は、私に知らせてください。私はこの答えを削除し、あなたの子供の問題で再び考えます。

    +0

    パフォーマンスはどうですか?一時的なテーブルや7k要素のIN節を使用すると、よりパフォーマンスが向上するはずですか? – slnowak

    +0

    @slnowak idsはコレクションであることに注意してください。なぜこのようなsmtを行うのはなぜですか?select * from foo foo where foo.id IN(select * from table(collection ids)) '。 idsはネストされた表です。あなたはそれにIDをプルしてクエリを実行することができます。パフォーマンスについて私はネストしたテーブルが最高で、一時的なものは2番目、条件は3番目のものだと思います。 –

    +0

    構文と機能自体についてもう少し説明してください。私はそれが存在するのか分からなかった。それは多かれ少なかれ一時テーブルを作成することと同等ですか?それで、1k IN句の制限に苦しんでいないのですか? – slnowak

    0

    単一INSERT文の長さの制限は、(すなわち、あなたが値を指定できるレコードの#)は、この操作は本当に最高の複数insert文で行われることがヒントです。

    プログラム内でidの値のリストを反復処理して、一度に1つ(または少数)を一時テーブルに挿入できますか?

    もちろん、これは最終的に元のオプション#1と似ていますが、実際は#1と#2の組み合わせです。とにかく、それは動作します! :)

    +0

    INSERT文の限界ではなく、むしろIN節の限界です。 – slnowak

    +1

    私はすべてのIDを含む "temp"テーブルに参加することによって 'IN'句を使用する必要を避けることを提案しています。 OPの状態として、挑戦はどのように私の答えが対処するのを助けるものであるか、一時テーブルにIDを挿入するようになります。あなたはまだ "idのリスト"に参加しますが、 'IN'の代わりに' JOIN'を使います。 – SlimsGhost

    1

    オラクルは、私が本当に/独自の機能/構文を使用する必要がある場合、私はそれを生きているオラクルに対してテストしようと決めた。 https://mvnrepository.com/artifact/org.testcontainershttps://github.com/testcontainers/testcontainers-java)、オラクル-XEモジュールを含む:あなたは、実行時間を気にして、CIサーバー上ドッカーを行うアクセス権を持って起こるない場合は

    だから、私はあなたにこれらの優れたライブラリをお勧めします。

    私は統合テスト中にoracle-xeコンテナをスピンアップし、ライブOracleインスタンスに対してテストできました。

    関連する問題