最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Oracle使用in語句不能超過1000問題的解決辦法

 更新時(shí)間:2022年05月23日 10:16:06   作者:謝哥哥blog  
最近項(xiàng)目中使用到了Oracle中where語句中的in條件查詢語句,在使用中發(fā)現(xiàn)了問題,所以下面這篇文章主要給大家介紹了關(guān)于Oracle使用in語句不能超過1000問題的解決辦法,需要的朋友可以參考下

前言

在oracle中,使用in方法查詢記錄的時(shí)候,如果in后面的參數(shù)個(gè)數(shù)超過1000個(gè),那么會發(fā)生錯(cuò)誤,JDBC會拋出“java.sql.SQLException: ORA-01795: 列表中的最大表達(dá)式數(shù)為 1000”這個(gè)異常。

我的解決方案是:

一、建立臨時(shí)表

ORACLE臨時(shí)表有兩種類型:會話級的臨時(shí)表和事務(wù)級的臨時(shí)表。

1、ON COMMIT DELETE ROWS

它是臨時(shí)表的默認(rèn)參數(shù),表示臨時(shí)表中的數(shù)據(jù)僅在事務(wù)過程(Transaction)中有效,當(dāng)事務(wù)提交(COMMIT)后,臨時(shí)表的暫時(shí)段將被自動(dòng)截?cái)啵═RUNCATE),但是臨時(shí)表的結(jié)構(gòu) 以及元數(shù)據(jù)還存儲在用戶的數(shù)據(jù)字典中。如果臨時(shí)表完成它的使命后,最好刪除臨時(shí)表,否則數(shù)據(jù)庫會殘留很多臨時(shí)表的表結(jié)構(gòu)和元數(shù)據(jù)。

2、ON COMMIT PRESERVE ROWS

它表示臨時(shí)表的內(nèi)容可以跨事務(wù)而存在,不過,當(dāng)該會話結(jié)束時(shí),臨時(shí)表的暫時(shí)段將隨著會話的結(jié)束而被丟棄,臨時(shí)表中的數(shù)據(jù)自然也就隨之丟棄。但是臨時(shí)表的結(jié)構(gòu)以及元數(shù)據(jù)還存儲在用戶的數(shù)據(jù)字典中。如果臨時(shí)表完成它的使命后,最好刪除臨時(shí)表,否則數(shù)據(jù)庫會殘留很多臨時(shí)表的表結(jié)構(gòu)和元數(shù)據(jù)。

建立臨時(shí)表之后,in語句里面就可以使用子查詢,這樣就不會有超過1000報(bào)錯(cuò)的問題了create global temporary table test_table 
(id varchar2(50), name varchar2(10)) 
on commit preserve rows; --創(chuàng)建臨時(shí)表(當(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í)表數(shù)據(jù)
DROP TABLE test_table; --刪除臨時(shí)表

建立臨時(shí)表之后,in語句里面就可以使用子查詢,這樣就不會有超過1000報(bào)錯(cuò)的問題了

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

上面的語句其實(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ù)會用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)Oracle in語句不能超過1000內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

清丰县| 神池县| 新泰市| 泗洪县| 恩平市| 自治县| 姚安县| 沈阳市| 北辰区| 布拖县| 磴口县| 临潭县| 驻马店市| 上林县| 闸北区| 靖州| 扶风县| 聂拉木县| 锡林郭勒盟| 大庆市| 甘肃省| 内乡县| 新和县| 四会市| 英吉沙县| 荔波县| 新安县| 叙永县| 岚皋县| 鄂尔多斯市| 岫岩| 响水县| 南康市| 湘潭县| 安龙县| 积石山| 鄂温| 石柱| 福海县| 德格县| 玉林市|