3

私のプログラムでは、ID を知ることに関する追加情報を取得する必要がある状況がたくさんあります。だから私はIDのリストを持っていますが、その長さは非常に長くなる可能性があります(たとえば、100000要素)。

一時テーブルを使用せずにSQLを取得するために、このリストを使用してオラクルに転送するにはどうすればよいですか?

いいえ、コレクションを使用しようとしています:

CREATE TYPE TEST_VARRAY IS VARRAY(5000) OF NUMBER(18);

SELECT G.ID, G.NAME FROM ANY_TABLE G
WHERE G.ID IN
(
SELECT COLUMN_VALUE FROM TABLE(
NEW TEST_VARRAY
(0,1,2,3... and so on ...,995,996,997,998,999)
)
);

1000個の数字があります。そして、このクエリを実行しようとすると、エラーのORA-00907: missing right parenthesisヒントが表示されます! しかし、最初の 0 を削除すると (999 個の数字があるため)、SQL は問題なく実行されます。

ここで何が問題ですか?

4

2 に答える 2

5

OracleのIN句には制限があります。

コンマで区切られた式のリストには、1000 個を超える式を含めることはできません。式のセットのカンマ区切りのリストには、任意の数のセットを含めることができますが、各セットに含めることができる式は 1000 個までです。

ここまたはここまたはここを読んでください

于 2013-09-26T10:11:02.520 に答える
1

私の意見では、あなたはコレクションを悪用していますが、少なくともあなたのようなことが良いことかどうかはわかりません。

私が理解している限り、実行前にこのクエリを生成するので、そのようにする問題は何ですか?

with ids as (select /*+ materialize */ 1 id from dual union all
             select 2 from dual union all
             select 3 from dual union all
             select 4 from dual union all
             /* repeat with the ids you need */
             select 9999 from dual)
select *
from yourTable, ids
where yourTable.id = ids.id;

以上です!純粋な SQL のみで、制限はありません。パフォーマンスに関連しないことを確認するためのヒントを追加しましmaterializeたが、スキップできると思います。

一時テーブル、コレクション、作成およびサポートするものはありません。ただのSQL。

ids out of withintofrom句を配置すると、どの RDBMS でも機能します (推測します)。

于 2014-03-17T12:17:44.690 に答える