【问题标题】:ORA-01795: maximum number of expressions in a list is 1000 error in perl scriptORA-01795: 列表中的最大表达式数为 1000 perl 脚本中的错误
【发布时间】:2020-06-22 04:10:34
【问题描述】:

我正在尝试使用 NOT IN 子句运行查询,例如:

SELECT * FROM table WHERE column NOT IN (?,?,...) (>1000 items) 我收到 ORA-01795: maximum number of expressions in a list is 1000 错误。

在我的脚本中,我正在做类似的事情:

my $lparam = join ', ' => ('?') x @ids; 
$lquery = "SELECT * FROM table WHERE column NOT IN ($lparam)";

$lcsr = $zdb->prepare($lquery);
$lcsr->execute( @ids );

我想将 NOT IN 子句拆分为 where (A not in (a,b,c) AND A not in (d,e,f)) ... 之类的内容,我们怎样才能做到这一点?

【问题讨论】:

  • 您可能必须将数据放在临时表中并对其进行检查。
  • 临时表可能会导致性能问题。我们可以在 perl 中有任何替代方法来拆分数组并在多个 NOT IN 子句中使用吗?
  • 关于“临时表可能会导致性能问题”,人们更倾向于相信绕过用于保护性能的限制更有可能做到这一点。不管怎样,我该睡觉了。

标签: oracle perl oracle11g


【解决方案1】:

给你,添加三元组并计算它们。

my $count = 0;
$lquery = "SELECT * FROM table WHERE (A ";
while (@ids -$count > 3)  {
    $lquery .= "NOT in (?, ?, ?) AND A ";
    $count += 3;
}
my $lparam = join ', ' => ('?') x (@ids - $count); 

$lquery .= "NOT  IN ($lparam))";

【讨论】:

    【解决方案2】:

    您可以使用以下列的组合来使用IN 列表:

    SELECT * FROM table WHERE (column,1) NOT IN ((?,1),(?,1),...) (>1000 items)
    

    这里,1 用作第二列。您可以在IN 子句列表中给出超过 1000 个值。这是一种跳过限制的解决方法。

    【讨论】:

    • 那么我怎样才能修改我上面的 perl 代码来用元组创建这个 NOT IN 子句呢?
    • 抱歉,我不是 Perl 专家。
    • 你真的应该通过使用临时表或重构代码来解决你的问题......生成大量 NOT IN() 值列表来检查是非常糟糕的形式
    • @Tanami,这取决于查询、表结构和索引的使用情况。
    • 当然,就像专家知道何时适合使用 goto 一样
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2020-09-28
    • 2013-07-24
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多