【问题标题】:ORA-01795: maximum number of expressions in a list is 1000 error with myibatisORA-01795: 列表中的最大表达式数为 1000 使用 mybatis 时出错
【发布时间】:2018-07-14 12:40:27
【问题描述】:

我正在编写一个带有 IN 子句的更新查询,我在其中传递了 List

update table set postcode={#postcode} where id in
<foreach collection="addresses" index="index" item="item" open="(" 
separator="," close=")">#{item}</foreach> 

当我在地址中的记录少于 1000 条时,这运行正常。如果记录超过 1000 条,我会收到以下错误:

ORA-01795:列表中的最大表达式数为 1000。 这怎么处理?我遇到了一些他们在hibernate中处理过的线程。我如何使用具有超过1000条记录的myibatis来处理它。

【问题讨论】:

  • 使用集合 [1, 2] 因为它们可以处理超过 1000 个项目。虽然无法在 ibatis 中使用集合,但它内置在 Java 中,第一个链接显示了如何在 Java 中将集合作为绑定参数传递。
  • @MT0 这可以在 Java 端排序吗..比如检查前 1000 条记录并处理,然后再检查下 1000 条记录。它会影响性能吗?
  • 为什么要检查 1000 个项目并循环?只需在单个集合中传递所有 948,732 个项目(或您拥有的许多项目)并使用绑定参数将其包含在查询中。

标签: java oracle foreach ibatis


【解决方案1】:

将所有这些值存储到一个单独的表中,然后在子查询中使用它

update table set
  postcode = some_value
where id in (select values from a_separate_table)

【讨论】:

  • 此语法适用于 myibatis 更新表 set postcode = some_value where id in (select values from a_separate_table) 只有 foreach 循环有效
  • 真可惜;不幸的是,我不知道 myibatis - 希望其他人会提供帮助。
【解决方案2】:

ORA-01795:列表中的最大表达式数为 1000

这无法处理,直到您将IN 子句中的表达式总数严格限制为小于1000

或者,您可以将查询拆分为多个,也可以将您的列表拆分并执行UNION 来实现相同的目的。

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多