2

私にはジレンマがあります。JavaとOracleを使用しており、PL/SQL側でクエリを保持しようとしています。条件がある場合とない場合があるこれらの複雑なクエリが発生するまでは、すべて問題ありません。

Javaでは、WHERE句と条件を組み合わせるのは難しくありませんが、それは良くありません。また、PL / SQL側では、次のdynamic queriesような文字列操作のみが可能であることがわかりました。

IF inputname IS NOT NULL THEN    
    query := query ||' and NAME=' || inputname; 
END IF;

今考えているのは、クエリをPL / SQLに残しWHERE、関数パラメータを使用して句を送信することです。良い推奨事項や例はありますか?

4

5 に答える 5

1

SQLBuilderは、Java側から役立つ場合があります。これにより、SQLを動的にビルドするコンパイル時にチェックされるJavaコードを記述できます。

String selectQuery =
  (new SelectQuery())
  .addColumns(t1Col1, t1Col2, t2Col1)
  .addJoin(SelectQuery.JoinType.INNER_JOIN, joinOfT1AndT2)
  .addOrderings(t1Col1)
  .validate().toString();
于 2008-09-23T18:18:23.947 に答える
1

お気づきのように、PL/SQL は動的 SQL の作成には適していません。その文字列操作は苦痛です。クライアントから where 句を送信することはできますが、SQL インジェクションを確認する必要があります。文字列区切り文字から見て、その中でのみ許可する必要があります) など。別のオプションは、フィールド フィルターの事前定義されたパラメーター リストを受け取り、パラメーター フィールドに対して各列に "like" を適用するストアド プロシージャです。

于 2008-09-23T18:25:16.270 に答える
0

PL / SQLでの使用:

EXECUTE IMMEDIATE lString;

これにより、使用するSQLのほとんどのビットにlString(VARCHAR2)を組み込むことができます。例えば

  EXECUTE IMMEDIATE 'SELECT  value
                     FROM    TABLE
                     WHERE   '||pWhereClause
  INTO    lValue;

複数の行を返し、EXECUTEIMMEDIATEでDDLステートメントを実行することもできます。

于 2008-09-23T18:21:38.870 に答える
0

クエリ作成のロジック全体をJavaまたはOracleの1か所にまとめた方がよいと思います。あなたはJavaでそれを行う方法を知っていると思います。Oracleでは、クエリが行のみを取得する場合は、EXECUTE IMMEDIATE...INTO句を使用できます。

クエリが複数の行を返し、単一のパラメータがある場合(IN演算子を使用しない)、REF CURSOR戦略を使用してクエリ結果をループするか、カーソル自体をJavaプログラムに戻すことができます(使用する場合はOracle javaクラスをインポートする必要があります)。 。Googleでの最初の参照カーソルの回答

INパラメータを使用する必要がある場合(または別のまれなケース)、DBMS_SQLパッケージを使用してクエリを解析する必要があります。これは冗長すぎて使用するのが少し難しいですが、非常に柔軟性があります。DBMS_SQL doc(メソッドを読む前にフロー図を見てください)

于 2008-09-23T19:12:58.950 に答える
0

ええ、EXECUTEIMMEDIATEも私の友達です。提案をありがとう。今回はパラメータ付きのWHERE句だけを送ってみようと思います

于 2008-09-23T18:55:29.880 に答える