【问题标题】:java.sql.SQLSyntaxErrorException: ORA-01795: maximum number of expressions in a list is 1000java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表达式数为 1000
【发布时间】:2014-08-05 03:46:04
【问题描述】:

我们都知道,当尝试对超过 1000 个值的查询进行轰炸时,我们会看到此异常。列限制的最大值是 1000 .. 最好的解决方案是将查询分成两个。你们可以建议一些可能的代码重构方法来解决我的问题。任何帮助将不胜感激。

audTypeFieldIdList 大于 1000 个值时,我们会看到异常。

try {
        String query = "select AUDIT_TYPE_FIELD_ID, FIELD_NAME from AUDIT_TYPE_FIELD where AUDIT_TYPE_FIELD_ID in (";
        int x = 0;
        for (int y = 1; y <= audTypeFieldIdList.size(); y++) {
            query += audTypeFieldIdList.get(x);
            if (y != audTypeFieldIdList.size()) {
                query += ", ";
            }
            x++;
        }
        query += ")";    



List<Long> audTypeFieldIdList, Connection connection) {          

    ResultSet rs = null;
    Statement stmt = null;
    List<AuditTypeField> audTypeFieldList = new ArrayList<AuditTypeField>();
    try {
        String query = "select AUDIT_TYPE_FIELD_ID, FIELD_NAME from AUDIT_TYPE_FIELD where AUDIT_TYPE_FIELD_ID in (";
        int x = 0;
        for (int y = 1; y <= audTypeFieldIdList.size(); y++) {
            query += audTypeFieldIdList.get(x);
            if (y != audTypeFieldIdList.size()) {
                query += ", ";
            }
            x++;
        }
        query += ")";



        stmt = connection.createStatement();
        rs = stmt.executeQuery(query);
        while (rs != null && rs.next()) {
            AuditTypeField audTypeField = PluginSystem.INSTANCE
                    .getPluginInjector().getInstance(AuditTypeField.class);
            audTypeField.setId(rs.getLong("AUDIT_TYPE_FIELD_ID"));
            audTypeField.setName(rs.getString("FIELD_NAME"));
            audTypeFieldList.add(audTypeField);
        }
        return audTypeFieldList;
        return audTypeFieldList;

【问题讨论】:

  • 列表中的 1000 多个元素从何而来?据推测,人类没有输入那么多值。它们是否来自针对数据库的不同查询?如果是这样,您希望将这两个查询结合起来。
  • 是的,它来自针对数据库的两个不同查询
  • 请不要大喊大叫。那么为什么要进行两个单独的查询呢?

标签: java arrays angularjs jakarta-ee oracle-sqldeveloper


【解决方案1】:

IN 子句中的条目不能超过 1000 个。有以下两种解决方案:

  1. 使用inner query 解决此问题。您可以创建一个临时表并在 IN 子句中使用它。

  2. 使用由OR 子句分隔的多个IN 子句将其分成1000 个条目。

示例查询:

select * from table_name
  where
      column_name in (V1,V2,V3,...V1000)
  or
      column_name in (V1001,V1002,V1003,...V2000)
  ...

Read more.. 并查看Oracle FAQ

【讨论】:

  • 我会选择后一个,因为查询是动态生成的,你对第二部分有什么想法吗?我应该怎么做?
  • 编写一个基于条目大小的简单程序。这很简单。
  • 点击我在更新帖子中与您分享的链接。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 2020-09-28
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2013-07-24
相关资源
最近更新 更多