2

JDBCサーブレットでデータベース(Oracle10)への接続に使用しています。
以下は、3 つのパラメーターを動的に設定するクエリです。

  1. テーブル名
  2. 列名
  3. 価値

クエリ:

query = "select ? from ? where ? = ?";
mypstmt = con.prepareStatement(query);
mypstmt.setString(1, tableName);
mypstmt.setString(2, columnName);
mypstmt.setString(3, columnName2);
mypstmt.setString(4, value);

しかし、上記のクエリは私にエラーを与えています:

java.sql.SQLException: ORA-00903: invalid table name

テーブル名を確認しました。それは正しいです。クエリを次のように書くと:

query = "select "+columnName+" from "+tableName+" where "+columnName2+" = ?";

その後、正常に実行されています。

Table nameとを次のColumn Namesように設定したい場合はどうすればよいですかmypstmt.setString(1,tableName)

Edit1にし たい理由はparameterize、ユーザーがテーブル名と列名を選択/入力できるようにしているため、.Table nameColumn nameSQL Injection

4

3 に答える 3

5

PreparedStatementテーブル名はバインド変数にできないため、テーブル名を直接渡すことはできません。準備済みステートメント

プリコンパイル済み SQL ステートメントを表すオブジェクト。

SQL ステートメントはプリコンパイルされ、PreparedStatement オブジェクトに格納されます。このオブジェクトを使用して、このステートメントを複数回効率的に実行できます。

文字列連結を使用してSQLを構築する必要があります。ストアド プロシージャを使用すると、動的 SQLを使用してテーブル名を動的に渡すことができます。this SO answerを見て、なぜ制限されているのかを理解してください。

于 2013-07-11T06:16:21.083 に答える