oracle异常:表名无效

时间:2013-07-11 06:14:42

标签: java oracle servlets jdbc

我正在使用JDBC连接Servlets中的数据库(Oracle10) 以下是我的查询,其中我想动态设置三个参数。

  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 nameColumn Names设置为mypstmt.setString(1,tableName)

    ,该怎么办?

    EDIT1 我想parameterize Table nameColumn name的原因是我允许用户选择/输入表名和列名,所以我想避免使用SQL Injection

3 个答案:

答案 0 :(得分:5)

我们无法将表名直接传递给PreparedStatement,因为表名不能是绑定变量。 PreparedStatement

  

表示预编译SQL语句的对象。

     

预编译SQL语句并将其存储在PreparedStatement对象中。然后可以使用此对象多次有效地执行此语句。

您必须使用字符串连接构造sql。使用存储过程,您可以使用Dynamic SQL动态传递表名。甚至可以查看this SO answer以了解它为何受到限制。

答案 1 :(得分:3)

您只能在SQL查询中参数化?列值。表/列参数化是不可能的,而是使用变量来构造这样的查询,例如:

void query(String tableName, String columnName, String queryColumnName String val) {
String query = "select "+columnName+" from "+tableName+" where "+queryColumnName+" = ?";
mypstmt.setString(1, val);
..
}

答案 2 :(得分:1)

在PreparedStatement中,您只能替换值。您无法替换表名或列名。