ORACLE_DB
where 조건에 in 으로 1000개 이상의 파라미터 넣기...
겸둥이곰
2022. 9. 30. 11:21
반응형
오늘 SMS가 발송 요청을 할때 오류가 난다는 고객사의 민원이 접수되었다. What?

로그를 뒤져보니.. 아래와 같은 오류가 ...
Error updating database. Cause: java.sql.SQLSyntaxErrorException: ORA-01795: 목록에 지정 가능한 식의 최대수는 1000 입니다
그래서.. 쿼리문을 봤는데...
원래 쿼리를 보니..
foreach로 in 다음에 반복문으로 파라미터를 뿌려주고 있었다.
아마도.. 이걸 짜면서.. 오라클 쿼리 in 조건에 1000개의 파라미터가 들어가면 오류가 난다는 사실을 몰랐던거 같다.
다른 나이스한 방법도 있겠지만.. 찾아볼 시간없어서 임시처방으로 처리한 방법은 아래와 같다.
select #{item} from dual uion
select #{item} from dual uion
select #{item} from dual uion
select #{item} from dual uion
.
.
.
이걸 쿼리로 보면..
select * from table where item in (
select '1' from dual uion
select '2' from dual uion
select '3' from dual uion
select '4' from dual
.
.
.
)
이렇게 만들어 진다.
이렇게 하면 where 절에 조건에 in 으로 1000개 이상이 들어가도 이상이 없다.
보통
select *
from table
where item in (
select item
from table 2
)
를 쓸때 in 다음에 오는 쿼리의 갯수를 생각하지 않고 사용하는것에 착안해서 찾은 해결 방안이다.
다소 무식한?? 방법일수 있으나.. 방법을 찾을려면 시간이 걸리기에 ㅋㅋㅋㅋ
insert는 좀 있는거 같은데.. update, select의 조건에 들어가는건 찾기가 어려운듯...
하긴.. 이렇게 한번에 in 안에 파라미터를 1000개 이상 보내서 update 하는 경우가 많을까??
좀더 깔끔한 방법을 한번 찾아보니... 간단한 방법이 있네.. ㅋㅋㅋㅋ
복수컬럼을 subQuery로 넣어주면 되는군요..
WHERE (1, cust_no) in
<foreach collection="cust_no" item="item", open="(", separator="," close=")"> (1, #{cust_no}) </foreach>
where (1, cust_no ) in ((1, 'CUST00001'), (1, 'CUST00002').......)
이런식으로...
이렇게 오류가 날땐.. 최대한 빠르게 수습하고.. 더 나은 방법도 찾아보는 습관을.. ^^

반응형