0

我在 C#.Net 和 Oracle 工作。我正在将字符串传递给查询。我曾使用此代码连接所有项目 ID

List<string> listRetID = new List<string>();
                foreach (DataRow row in dtNew.Rows)
                {
                    listRetID.Add(row[3].ToString());
                }

这种连接超过 10,000。所以我收到这样的错误消息..

ORA-01795: maximum number of expressions in a list is 1000

如何解决这个..

4

4 回答 4

4

文档指出:

以逗号分隔的表达式列表最多可以包含 1000 个表达式。以逗号分隔的表达式集合列表可以包含任意数量的集合,但每个集合最多可以包含 1000 个表达式。

大概你正在使用这个字符串作为 inIN (...)限制的内容,在这种情况下,你真的无能为力 - 这只是行不通。解决此问题的一种常见方法是生成一个虚拟表作为子查询或公用表表达式 (CTE) 并加入该表,但我不确定您将如何翻译您的列表 - 可能类似于您正在做的任何事情用你的IN条款。您最终希望查询看起来像:

with tmp_tab as (
    select <val1 from list> as val from dual
    union all select <val2 from list from dual
    union all select <val3 from list from dual
    ...
)
select <something>
from <your table> yt
join tmp_tab tt on yt.<field> = tt.val

但这需要在每次运行时生成包括 CTE 在内的整个(巨大)查询,并且没有机会使用绑定变量。

您可能会发现这种方法更可口。

于 2012-07-19T12:15:04.973 回答
1

您可以拥有 10 个包含 1000 个项目的列表,而不是 1 个包含 10000 个项目的列表。

WHERE some_column IN (1,2,...,1000)
   OR some_column IN (1001,1002,...2000) -- etc.
于 2012-07-19T12:52:36.740 回答
0

不是 C# 人,但我只会将列表拆分为listRetID多个列表或创建列表列表

然后遍历该列表列表并对列表的每个元素执行查询。

于 2012-07-19T13:08:55.437 回答
0

您查询的目的是什么?

看起来您正在选择某些列等于某个查询的记录之一的第 3 列的行。

执行此操作的正确方法是 SQL 连接或子查询。绝对没有必要将它带入 C# 代码。例如,使用子查询,您可以编写如下内容:

SELECT *
FROM atable
WHERE afield IN (
    SELECT field3
    FROM someothertable)
于 2012-07-19T13:21:56.237 回答