Oracle ORA-01795:列表中表达式的最大数量为1000 perl脚本中的错误

Oracle ORA-01795:列表中表达式的最大数量为1000 perl脚本中的错误,oracle,perl,oracle11g,Oracle,Perl,Oracle11g,我正在尝试使用NOT IN子句运行查询,如: 从列不在(?,…)中的表中选择*(>1000项)我得到了ORA-01795:列表中表达式的最大数量是1000个错误 在我的脚本中,我做了如下操作: my $lparam = join ', ' => ('?') x @ids; $lquery = "SELECT * FROM table WHERE column NOT IN ($lparam)"; $lcsr = $zdb->prepare($lquery);

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

从列不在(?,…)中的表中选择*(>1000项)
我得到了ORA-01795:列表中表达式的最大数量是1000个错误

在我的脚本中,我做了如下操作:

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

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

我想将NOT IN子句拆分为类似于
的内容,其中(A不在(A,b,c)和A不在(d,e,f))…
我们如何实现这一点?

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

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

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

给你,添加三倍并计数

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))";

您可能需要将数据放在临时表中,并进行检查。临时表可能会导致性能问题。在perl中,我们是否可以选择拆分数组并在多个NOT in子句中使用?关于“临时表可能会导致性能问题”,人们更倾向于相信,绕过用于保护性能的限制更有可能做到这一点。无论如何,我该睡觉了。那个么我如何修改我上面的perl代码来创建这个带有元组的NOT IN子句呢?对不起,我不是perl的专家。你们真的应该通过使用临时表或重构代码来解决你们的问题。。。生成大量的NOT IN()值列表以进行检查非常糟糕form@Tanami,这取决于查询、表结构和索引的使用情况。当然,这与专家知道何时使用goto相同