我正在使用JDBC
连接Servlets中的数据库(Oracle10)
以下是我的查询,其中我想动态设置三个参数。
查询:
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 name
和Column name
的原因是我允许用户选择/输入表名和列名,所以我想避免使用SQL Injection
。
答案 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中,您只能替换值。您无法替换表名或列名。