【发布时间】:2015-01-23 02:32:05
【问题描述】:
我有一个程序可以计算来自各种数据源的记录数。我将数据库名称和表名称分别存储在名为database_names 和table_names 的数组列表中。我无法让它运行:
for (int i = 0; i < table_names.size(); i++) {
String query = "select count(1) from ?.?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, database_names.get(i));
stmt.setString(2, table_names.get(i));
ResultSet rs = stmt.executeQuery();
}
我收到 ORA-00903: invalid table name 错误。我设置了打印语句以确保我的database_names.get(i) 和table_names.get(i) 打印出正确的值。它们是,如果我将数据库名称和表名称硬编码到我的query 字符串中,程序就能够计算记录。
如何正确准备我的查询语句,使其具有以下形式:
select count(1) from database_name.table_name
【问题讨论】:
-
我认为你做不到。
PreparedStatementJavadoc 说(部分)注意:用于设置 IN 参数值的 setter 方法(setShort、setString 等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数的 SQL 类型为 INTEGER,则应使用方法 setInt。 不存在setTableName方法。 -
@ElliottFrisch 我的
database_name和table_name都是字符串,我使用的是setString()方法,所以我的查询不应该解析为select count(1) from sampleDB.sampleTable吗? -
不,因为表名不是 SQL 类型 VARCHAR、CHAR 等。关键问题是 SQL 类型。此外,由于表正在更改,查询计划将不可重用。只需使用
Statement并动态构建查询。 -
预准备语句的主要用途之一是允许数据库为文本创建执行计划。虽然绑定变量可用于标准值,但它们不能用于要访问的表。这完全违背了目的。
-
这些字段是否来自用户?如果是这样,是的!
标签: java sql oracle prepared-statement