首頁  >  文章  >  資料庫  >  實例解決Oracle使用in語句不能超過1000問題

實例解決Oracle使用in語句不能超過1000問題

WBOY
WBOY轉載
2022-06-13 18:11:142406瀏覽

這篇文章為大家帶來了關於Oracle的相關知識,其中主要介紹了關於使用in方法查詢記錄的時候,如果in後面的參數個數超過1000個,那麼會發生錯誤,JDBC會拋出「java.sql.SQLException: ORA-01795: 列表中的最大表達式數為1000」這個例外。下面一起來看看該怎麼解決,希望對大家有幫助。

實例解決Oracle使用in語句不能超過1000問題

推薦教學:《Oracle影片教學

在oracle中,使用in方法查詢記錄的時候,如果in後面的參數個數超過1000個,那麼會發生錯誤,JDBC會拋出“java.sql.SQLException: ORA-01795: 列表中的最大表達式數為1000”這個異常。

我的解決方案是:

一、建立臨時表

ORACLE臨時表有兩種類型:會話層級的臨時表和事務級的臨時表。

1、ON COMMIT DELETE ROWS

它是臨時表的預設參數,表示臨時表中的資料僅在事務過程(Transaction)中有效,當事務提交(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);

二、使用in() or in()

官方說: A comma-delimited list of expressions can contain no more than 1000 expressions. A comma-delimited list of sets of expressions can contain any number of sets, but each set can contain no more more than 1000 expressions

這裡使用oracle tuple( A comma-delimited list of sets of expressions) 也就是元組,語法如下:

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')

大家的工程多數會用ORM框架如MyBatis 我們可以藉助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使用in語句不能超過1000問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除