带有 sql IN 运算符的参数列表的preparedstatement

Posted

技术标签:

【中文标题】带有 sql IN 运算符的参数列表的preparedstatement【英文标题】:preparedstatement with list of parameters for sql IN operator 【发布时间】:2015-11-27 00:05:24 【问题描述】:

我在外部属性文件中有一条 sql 语句,因此不能像某些人建议的那样动态修改它:

query = select distinct BSG_HANDLE FROM MYUSER.MYTABLE WHERE RATE_CODE IN (?) AND CORP = ? 

SOAP 请求提供将用于填充 IN 值的字符串数组。

public BsgHandleResponse getBsgHandleByRateCode(
@QueryParam("rateCodes") String rateCodes,
@QueryParam("corp") String corp)

然后我将它们放入准备好的语句中,如下所示:

ps = startTimedPreparedStatement(conn,SQL_FROM_PROPERTIES_FILE);
ps.setString(1, rateCodes);
ps.setString(2, corp);
rs = ps.executeQuery();

如果 rateCodes 是这样的单个字符串值,它可以正常工作:

25

但是对于这样的多个值失败:

25, 1P

我认为我必须这样做

    public BsgHandleResponse getBsgHandleByRateCode(
    @QueryParam("rateCodes") final List<String> rateCodes,
    @QueryParam("corp") String corp)

    ps = startTimedPreparedStatement(conn,SQL_FROM_PROPERTIES_FILE);
    ps.setArray(1, rateCodes);
    ps.setString(2, corp);
    rs = ps.executeQuery();

但我无法让它工作。有什么想法吗?

【问题讨论】:

PreparedStatement question in Java against Oracle的可能重复 【参考方案1】:

PreparedStatement question in Java against Oracle

@DJ 提到的解决方案效果很好,但您必须注意一种极端情况,即您可以与 IN 子句一起使用的绑定值的数量存在限制。 对于 oracle,我认为接近 1K 或 4K。

【讨论】:

这看起来是一个聪明的解决方案。明天试试,然后回复你。谢谢!

以上是关于带有 sql IN 运算符的参数列表的preparedstatement的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的异常 'mysqli_sql_exception' 带有消息 'No index used in query/prepared statement'

如何在 Tedious 中运行 sql 查询,为 sql in 运算符提供多个值?

如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?

带有 IN 子句中参数列表的 PreparedStatement [重复]

使用带有休眠 SQL 查询的多列的参数化 IN 子句

在 jasperreport 中传递 SQL“IN”参数列表