Oracle使用in語(yǔ)句不能超過(guò)1000問(wèn)題的解決辦法
前言
在oracle中,使用in方法查詢記錄的時(shí)候,如果in后面的參數(shù)個(gè)數(shù)超過(guò)1000個(gè),那么會(huì)發(fā)生錯(cuò)誤,JDBC會(huì)拋出“java.sql.SQLException: ORA-01795: 列表中的最大表達(dá)式數(shù)為 1000”這個(gè)異常。
我的解決方案是:
一、建立臨時(shí)表
ORACLE臨時(shí)表有兩種類型:會(huì)話級(jí)的臨時(shí)表和事務(wù)級(jí)的臨時(shí)表。
1、ON COMMIT DELETE ROWS
它是臨時(shí)表的默認(rèn)參數(shù),表示臨時(shí)表中的數(shù)據(jù)僅在事務(wù)過(guò)程(Transaction)中有效,當(dāng)事務(wù)提交(COMMIT)后,臨時(shí)表的暫時(shí)段將被自動(dòng)截?cái)啵═RUNCATE),但是臨時(shí)表的結(jié)構(gòu) 以及元數(shù)據(jù)還存儲(chǔ)在用戶的數(shù)據(jù)字典中。如果臨時(shí)表完成它的使命后,最好刪除臨時(shí)表,否則數(shù)據(jù)庫(kù)會(huì)殘留很多臨時(shí)表的表結(jié)構(gòu)和元數(shù)據(jù)。
2、ON COMMIT PRESERVE ROWS
它表示臨時(shí)表的內(nèi)容可以跨事務(wù)而存在,不過(guò),當(dāng)該會(huì)話結(jié)束時(shí),臨時(shí)表的暫時(shí)段將隨著會(huì)話的結(jié)束而被丟棄,臨時(shí)表中的數(shù)據(jù)自然也就隨之丟棄。但是臨時(shí)表的結(jié)構(gòu)以及元數(shù)據(jù)還存儲(chǔ)在用戶的數(shù)據(jù)字典中。如果臨時(shí)表完成它的使命后,最好刪除臨時(shí)表,否則數(shù)據(jù)庫(kù)會(huì)殘留很多臨時(shí)表的表結(jié)構(gòu)和元數(shù)據(jù)。
建立臨時(shí)表之后,in語(yǔ)句里面就可以使用子查詢,這樣就不會(huì)有超過(guò)1000報(bào)錯(cuò)的問(wèn)題了create global temporary table test_table (id varchar2(50), name varchar2(10)) on commit preserve rows; --創(chuàng)建臨時(shí)表(當(dāng)前會(huì)話生效) --添加數(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í)表數(shù)據(jù) DROP TABLE test_table; --刪除臨時(shí)表
建立臨時(shí)表之后,in語(yǔ)句里面就可以使用子查詢,這樣就不會(huì)有超過(guò)1000報(bào)錯(cuò)的問(wèn)題了
select * from table_name where id in(select id from test_table);
二、使用in() or in()
官方說(shuō): 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) 也就是元組,語(yǔ)法如下:
SELECT * FROM TABLE_NAME WHERE (1, COLUMN_NAME) IN ((1, VALUE_1), (1, VALUE_2), ... ... ... ... (1, VALUE_1000), (1, VALUE_1001));
比如我們想要從用戶表里通過(guò)用戶id 查詢用戶信息可以這樣寫:
select * from user u where (1, u.id) in ((1, 'id001'),(1,'id002'),(1,'id003'))
上面的語(yǔ)句其實(shí)等同于:
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ù)會(huì)用ORM框架如MyBatis 我們可以借助MyBatis的foreach 原來(lái)是這寫:
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語(yǔ)句不能超過(guò)1000問(wèn)題解決的文章就介紹到這了,更多相關(guān)Oracle in語(yǔ)句不能超過(guò)1000內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ORACLE SQL-UPDATE、DELETE、INSERT優(yōu)化和使用技巧分享
這篇文章主要介紹ORACLE中SQL-UPDATE、DELETE、INSERT優(yōu)化和使用技巧,需要的朋友可以參考下2013-03-03詳解Oracle調(diào)試存儲(chǔ)過(guò)程
這篇文章主要介紹了詳解Oracle調(diào)試存儲(chǔ)過(guò)程的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08Oracle數(shù)據(jù)庫(kù)查看與修改內(nèi)存配置的方法
在使用Oracle時(shí)我們需要關(guān)注數(shù)據(jù)庫(kù)的內(nèi)存使用情況,以確保其正確高效地運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)查看與修改內(nèi)存配置的相關(guān)資料,需要的朋友可以參考下2023-11-11Oracle計(jì)算年齡的實(shí)用方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Oracle計(jì)算年齡的相關(guān)資料,在我們?nèi)粘?shí)際業(yè)務(wù)中,可能需要根據(jù)某人出生日期、身份證號(hào)碼來(lái)實(shí)時(shí)計(jì)算年齡,需要的朋友可以參考下2023-09-09oracle10g 數(shù)據(jù)備份與導(dǎo)入
oracle10g 數(shù)據(jù)備份與導(dǎo)入 實(shí)現(xiàn)方法2009-06-06對(duì)比Oracle臨時(shí)表和SQL Server臨時(shí)表的不同點(diǎn)
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)建立臨時(shí)表的相關(guān)知識(shí)以及和SQL Server臨時(shí)表的不同點(diǎn)的對(duì)比,希望能夠?qū)δ兴鶐椭?/div> 2015-09-09Oracle根據(jù)時(shí)間查詢的一些常見情況匯總
根據(jù)時(shí)間查詢是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Oracle根據(jù)時(shí)間查詢的一些常見情況,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08最新評(píng)論