有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java编写的语句,使用函数作为where子句的一部分

我正在使用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)作为其索引的一部分。有没有一种方法可以使用带有数据库函数的预处理语句作为查询参数


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    乍一看,这个问题似乎不正确。在使用status变量(假设status是varchar列)前后缺少一个撇号

    String query = "SELECT DISTINCT trans_id FROM trans 
    WHERE status = '" + status + "' AND FN_GET_CUST_ID(trans.trans_id) = " + customerId;
    

    编辑:我不是java背景。然而,正如@Aron所说,最好使用占位符&;然后使用一些方法为参数设置值,以避免SQL Injection