5

Oracle データベースと通信するアプリケーションで、列名を参照してクエリを並べ替えようとしています。クエリの順序を動的に変更できるように、バインド変数を使用したいと考えています。

私が抱えている問題は、データベースが列ごとの順序を無視しているように見えることです。

バインド変数を介してデータベース列を参照する特定の方法があるかどうか、またはそれが可能かどうかを知っている人はいますか?

たとえば、私のクエリは

SELECT * FROM PERSON ORDER BY :1

(どこ:1にバインドされPERSON.NAMEます) クエリは結果をアルファベット順に返しません。データベースがこれを次のように解釈しているのではないかと心配しています:-

SELECT * FROM PERSON ORDER BY 'PERSON.NAME' 

これは明らかに機能しません。

どんな提案でも大歓迎です。

4

3 に答える 3

8

いいえ。テーブル名または列名にバインド変数を使用することはできません。

この情報は、実行計画を作成するために必要です。何を基準にして注文したいかを知らなければ、たとえば、どのインデックスを使用するかを判断することは不可能です。

変数をバインドする代わりに、プログラムが作成するときに列名を SQL ステートメントに直接補間する必要があります。SQL インジェクションに対して予防策を講じていると仮定すると、それによるマイナス面はありません。

更新:本当にフープを飛び越えたい場合は、おそらく次のようなことができます

order by decode(?, 'colA', colA, 'colB', colB)

しかし、それはばかげています。そして遅い。しないでください。

于 2009-03-04T10:46:27.813 に答える
2

JDBCを使用しているため。コードをバインド変数のないものに書き直すことができます。このようにして、オーダーバイを動的に変更することもできます。

String query = "SELECT * FROM PERS ";
if (condition1){
  query = query+ " order by name ";
// insert more if/else or case statements
} else {
  query = query+ " order by other_column ";
}
Statement select = conn.createStatement();
ResultSet result = select.executeQuery(query);

あるいは:

String columnName = getColumnName(input);
Statement select = conn.createStatement();
ResultSet result = select.executeQuery("SELECT * FROM PERS ORDER BY "+columnName);
于 2009-03-04T15:54:25.653 に答える