Oracle使用in語句不能超過1000問題的解決辦法
在oracle中,使用in方法查詢記錄的時候,如果in后面的參數(shù)個數(shù)超過1000個,那么會發(fā)生錯誤,JDBC會拋出“java.sql.SQLException: ORA-01795: 列表中的最大表達式數(shù)為 1000”這個異常。
我的解決方案是:
一、建立臨時表
ORACLE臨時表有兩種類型:會話級的臨時表和事務(wù)級的臨時表。
1、ON COMMIT DELETE ROWS
它是臨時表的默認參數(shù),表示臨時表中的數(shù)據(jù)僅在事務(wù)過程(Transaction)中有效,當(dāng)事務(wù)提交(COMMIT)后,臨時表的暫時段將被自動截斷(TRUNCATE),但是臨時表的結(jié)構(gòu) 以及元數(shù)據(jù)還存儲在用戶的數(shù)據(jù)字典中。如果臨時表完成它的使命后,最好刪除臨時表,否則數(shù)據(jù)庫會殘留很多臨時表的表結(jié)構(gòu)和元數(shù)據(jù)。
2、ON COMMIT PRESERVE ROWS
它表示臨時表的內(nèi)容可以跨事務(wù)而存在,不過,當(dāng)該會話結(jié)束時,臨時表的暫時段將隨著會話的結(jié)束而被丟棄,臨時表中的數(shù)據(jù)自然也就隨之丟棄。但是臨時表的結(jié)構(gòu)以及元數(shù)據(jù)還存儲在用戶的數(shù)據(jù)字典中。如果臨時表完成它的使命后,最好刪除臨時表,否則數(shù)據(jù)庫會殘留很多臨時表的表結(jié)構(gòu)和元數(shù)據(jù)。
建立臨時表之后,in語句里面就可以使用子查詢,這樣就不會有超過1000報錯的問題了create global temporary table test_table (id varchar2(50), name varchar2(10)) on commit preserve rows; --創(chuàng)建臨時表(當(dāng)前會話生效) --添加數(shù)據(jù) insert into test_table VALUES('ID001', 'xgg'); insert into test_table VALUES('ID002', 'xgg2'); select * from test_table; --查詢數(shù)據(jù) TRUNCATE TABLE test_table; --清空臨時表數(shù)據(jù) 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 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')
大家的工程多數(shù)會用ORM框架如MyBatis 我們可以借助MyBatis的foreach 原來是這寫:
where u.id in <foreach collection="userIds" item="item" separator="," open="(" close=")" index=""> #{item} </foreach>
現(xiàn)在改成:
where (1, u.id) in <foreach collection="userIds" item="item" separator="," open="(" close=")" index=""> (1, #{item}) </foreach>
總結(jié)
到此這篇關(guān)于Oracle使用in語句不能超過1000問題解決的文章就介紹到這了,更多相關(guān)Oraclein語句不能超過1000內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。