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 個までです。

おそらく、この文字列をIN (...)制限の内容として使用していると思われます。その場合、実際にできることは何もありません-これは機能しません. これを回避する一般的な方法は、サブクエリまたは共通テーブル式 (CTE) としてダミー テーブルを生成し、それに結合することですが、List をどのように変換するかはわかりません。あなたの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

10000 アイテムのリストを 1 つではなく、1000 アイテムのリストを 10 個持つことができます。

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 に答える