ホームページ  >  記事  >  データベース  >  Oracle がステートメント内で 1000 を超える値を使用できない問題を解決する例

Oracle がステートメント内で 1000 を超える値を使用できない問題を解決する例

WBOY
WBOY転載
2022-06-13 18:11:142408ブラウズ

この記事では、Oracle に関する関連知識を提供します。主に in メソッドを使用してレコードをクエリする方法を紹介します。in の後のパラメータの数が 1000 を超えた場合、何が起こりますか? エラー、JDBC がスローされます「java.sql.SQLException: ORA-01795: リスト内の式の最大数は 1000 です。」解決方法を見ていきましょうので、皆さんのお役に立てれば幸いです。

Oracle がステートメント内で 1000 を超える値を使用できない問題を解決する例

推奨チュートリアル: 「Oracle ビデオ チュートリアル

Oracle では、in メソッドを使用してクエリを実行します。レコード in 以降のパラメータの数が 1000 を超えると、エラーが発生し、JDBC は例外「java.sql.SQLException: ORA-01795: リスト内の式の最大数は 1000 です」をスローします。

私の解決策は次のとおりです:

1. 一時テーブルを作成します

ORACLE 一時テーブルには、セッション レベルの一時テーブルと、セッション レベルの一時テーブルの 2 つのタイプがあります。トランザクションレベルの一時テーブル。

1. ON COMMIT DELETE ROWS

これは一時テーブルのデフォルトのパラメータであり、一時テーブル内のデータがトランザクション プロセス (トランザクション) 中にのみ有効であることを意味します。トランザクションが送信されると (COMMIT)、一時テーブルの一時セグメントは自動的に切り捨てられます (TRUNCATE)。ただし、一時テーブルの構造とメタデータはユーザーのデータ ディクショナリに格納されたままになります。一時テーブルの役割が完了した場合は、一時テーブルを削除するのが最善です。そうしないと、データベースに一時テーブルの多くのテーブル構造とメタデータが保持されてしまいます。

2. ON COMMIT PRESERVE ROWS

これは、一時テーブルの内容が複数のトランザクションにわたって存在できることを意味します。ただし、セッションが終了すると、一時テーブルの一時セグメントはセッションの終了が破棄されると、一時テーブル内のデータも当然破棄されます。ただし、一時テーブルの構造とメタデータもユーザーのデータ ディクショナリに格納されます。一時テーブルの役割が完了した場合は、一時テーブルを削除するのが最善です。そうしないと、データベースに一時テーブルの多くのテーブル構造とメタデータが保持されてしまいます。

create global temporary table test_table 
(id varchar2(50), name varchar2(10)) 
on commit preserve rows; --创建临时表(当前会话生效)

--添加数据
insert into test_table VALUES('ID001', 'xgg');
insert into test_table VALUES('ID002', 'xgg2');

select * from test_table; --查询数据

TRUNCATE TABLE test_table; --清空临时表数据
DROP TABLE test_table; --删除临时表

一時テーブルを作成した後、in ステートメントでサブクエリを使用できるため、1000 件を超えるエラー レポートが発生する問題は発生しません。

select * from table_name where id in(select id from test_table);

2. in() または in を使用します。 ()

公式発表: 式のカンマ区切りリストには、1000 個以下の式を含めることができます。式のセットのカンマ区切りリストには、任意の数のセットを含めることができますが、各セットには以下を含めることができます。式は 1000 個以下です。

ここではタプルである oracle タプル (式のセットのカンマ区切りのリスト) が使用されています。構文は次のとおりです:

SELECT * FROM TABLE_NAME WHERE (1, COLUMN_NAME) IN 
((1, VALUE_1), 
(1, VALUE_2), 
...
...
...
...
(1, VALUE_1000),
(1, VALUE_1001));

たとえば、ユーザー テーブルのユーザー ID を使用してユーザー情報をクエリするには、次のように記述できます。

select * from user u where (1, u.id) in ((1, 'id001'),(1,'id002'),(1,'id003'))

上記のステートメントは、実際には次と同等です:

select * from user u where (1=1 and u.id='id001') or (1=1 and u.id='id002') or (1=1 and u.id='id003')

私たちのプロジェクトのほとんどは、MyBatis などの ORM フレームワークを使用します。MyBatis を使用できます。foreach はもともと次のように書かれていました:

where u.id in
<foreach collection="userIds" item="item" separator="," open="(" close=")" index="">
	#{item}
</foreach>

現在は次のように変更されています:

where (1, u.id) in
<foreach collection="userIds" item="item" separator="," open="(" close=")" index="">
	(1, #{item})
</foreach>

推奨チュートリアル: " Oracle ビデオ チュートリアル "

以上がOracle がステートメント内で 1000 を超える値を使用できない問題を解決する例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。