2

まず、序文: jdbc を使用してデータベースに一時テーブルを作成する Java クラスを作成しています。JSE6 と Oracle 11XE をテスト DB として使用していますが、クラスも DB2 に準拠している必要があります。

私が作成しようとしている一時テーブルは、より大きなテーブルから取得され、データに対していくつかのフィルタリングと集計を行います。フィルタリングのベースとなるパラメータは、実行時にユーザーによって決定されます。私がやろうとしていることの1つの簡単な例はこれです:

CREATE TABLE temp_table AS (
    SELECT
           table1.department_id,
           SUM(CASE WHEN table1.number_1 < &1 THEN table1.number_1 ELSE 0 END)) AS column1              
    FROM
           table1
    GROUP BY table1.department_id
)

私の問題は、データをフィルター処理するためにパラメーターを指定する必要があり、それらが適切にエスケープ/ローカライズ/型付けされていることを確認する必要があることです。これは準備済みステートメントを使用すると簡単ですが、DDL でバインド変数を使用することはできません。私が頼った一時的な解決策は、クエリ文字列を自分で変更し、正しい場所にパラメーターを書き込むことですが、これは、失われたことに加えて、PreparedStatement オブジェクトに頼るのではなく、すべてのチェックを実装する必要があることを意味します。他のすべての利点。

他の解決策を調査しましたが、今のところ納得できるものはありませんでした:

  1. 最初に空の temp_table を作成してから INSERT INTO temp_table(id, column1) (SELECT ...) で埋めることもできますが、パフォーマンスが低下する可能性があるため、CREATE temp_table AS に固執したいと思います

  2. 内部の SELECT クエリを保持する一時的なステートメントを作成し、適切にフォーマット/ローカライズされたものを生成することを考えました。クエリ文字列ですが、そこから最終的なクエリを取得する方法が見つかりませんでした(ここでは絶対に不可能だと読みました)。この場合に見つけた唯一のオプションはDebuggableStatementを使用することですが、それをプロジェクトに含めることができるかどうかはわかりません (また、私の問題を解決するための非常に洗練されていないようです)

  3. 私が考えている別の解決策は、一時テーブルを作成するクエリを単純に配置することです(それぞれに対して、CREATE AS(SELECT ...)全体をデータベースのプロシージャ内に配置します。次に、CallableStatement を使用して呼び出すことができます。このようにして、データベースとのより緊密な結合という代償を払って、型化の処理を回避し、それでも良好なパフォーマンスを得ることができます (プロシージャがそこにあることを確認するか、Java でそれらの追加を管理する必要があります)。 /データベースからの削除)

だから、私の質問は、私が考えることができるものよりも優れた代替手段はありますか?

4

1 に答える 1

0

これはデータベースに依存しないはずですか、それとも Oracle のみをターゲットにしていますか? PL/SQL を使用するためにストアド プロシージャに格納する必要はありません。必要なことを実行する無名の PL/SQL ブロックを作成して実行するだけです。無名 PL/SQL ブロックは動的に構築できるため、厳密に型指定された変数が PL/SQL で宣言されてパラメーターを保持し、Java コードが値を挿入します。文字列を作成するだけです。匿名の PL/SQL ブロックを実行すると、Oracle によって処理されます。

于 2012-07-01T00:05:33.737 に答える