准备语句 - 使用函数作为where子句的一部分

emu*_*ahy 0 java sql oracle prepared-statement

我正在使用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 (...)
Run Code Online (Sandbox Code Playgroud)

这不起作用.将该函数作为where子句的一部分会导致SQLException.我知道CallableStatement,并知道我可以先使用它然后连接结果.但是,此表使用FN_GET_CUST_ID(trans_id)作为其索引的一部分.有没有办法使用带有数据库函数的预准备语句作为查询参数?

Aar*_*lla 6

  1. 永远不要将SQL的参数连接到String中.始终使用占位符(?)和setXxx(column, value);.

  2. 如果您在自己喜欢的数据库工具中运行SQL,则会得到相同的错误.问题是Oracle出于某种原因无法使用该功能.你得到什么错误代码?