我正在使用一个 Java 准备好的语句,该语句从 Oracle 数据库获取数据。由于一些性能问题,查询使用“虚拟列”作为索引。
查询如下所示:
String status = "processed";
String customerId = 123;
String query = "SELECT DISTINCT trans_id FROM trans WHERE status = " + status + " AND FN_GET_CUST_ID(trans.trans_id) = " + customerId;
Connection conn = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(query);
ps.execute();
...
} catch (...)
这不起作用。将函数作为 where 子句的一部分会导致 SQLException。我知道 CallableStatement,并且知道我可以先使用它,然后连接结果。但是,该表使用 FN_GET_CUST_ID(trans_id) 作为其索引的一部分。有没有办法使用带有数据库函数的准备好的语句作为查询参数?
最佳答案
切勿将 SQL 参数连接到字符串中。始终使用占位符 (
?
) 和setXxx(column, value);
。如果您在您最喜欢的数据库工具中运行 SQL,您将收到相同的错误。问题是Oracle 由于某种原因无法使用该函数。您收到什么错误代码?
关于java - 准备好的语句 - 使用函数作为 where 子句的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1520209/