본문 바로가기
Oracle

[Oracle] ORA-01795 : 목록에 지정 가능한 식의 최대수는 1000 입니다.

by 상후 2023. 11. 13.
728x90
반응형

ORA-01795 : 목록에 지정 가능한 식의 최대수는 1000 입니다. 해결방법

오라클 Docs에 따르면 ORA-01795의 원인과 해결방법을 아래와 같이 제시하고 있다.

 

ORA-01795: maximum number of expressions in a list is 1000
Cause: Number of expressions in the query exceeded than 1000. Note that unused column/expressions are also counted Maximum number of expressions that are allowed are 1000.
Action: Reduce the number of expressions in the list and resubmit.

발생 원인
Oracle Docs의 내용을 직역하자면 아래와 같다.

원인: 쿼리의 식 수가 1000을 초과했습니다. 사용되지 않은 열 / 식도 계산됩니다. 허용되는 최대 식 수는 1000입니다.
조치: 목록에서 표현식 수를 줄이고 다시 제출하십시오.

필자는 IN() 절 안의 값의 개수가 1000개를 초과하여 발생하였다.
테스트 케이스

 

-- IN() 내부에 1000개가 넘는 데이터가 있다고 가정
SELECT * 
  FROM TEMP 
 WHERE NEW_USER IN ('상후', '후상', '무수히 많은 데이터');
해결 방법
IN절 내부에 서브쿼리를 사용하여 해결이 가능합니다.  

 

SELECT * 
  FROM NEW_USER 
 WHERE NAME IN (SELECT NAME FROM OLD_USER);

 

 

추가 해결방법 정리

 

SELECT * 
  FROM NEW_USER 
 WHERE NAME IN ('A', 'B')
    OR NAME IN ('C', 'D')
    OR NAME IN ('E', 'F');

 

이런식으로 OR을 활용하여 회피도 가능하다.

혹시나 Mybatis를 쓰고있다면 아래와 같이 작성하면 된다.

출처 : https://stackoverflow.com/questions/36366300/mybatis-foreach-hitting-limit-of-1000

 

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <trim suffixOverrides=" OR ID IN ()">
      <foreach item="item" index="index" collection="list" open="(" close=")">
          <if test="index != 0">
              <choose>
                  <when test="index % 1000 == 999">) OR ID IN (</when>
                  <otherwise>,</otherwise>
              </choose>
          </if>
          #{item}
      </foreach>
  </trim>
</select>

 

999번째에서  괄호를 닫고 OR를 이어붙이면서 쿼리를 동적으로 생성하는 방법이다.

 

<trim suffixOverrides> = <trim> 문 안에 쿼리 가장 뒤에 해당하는 문자들이 있으면 자동으로 지워준다.

 

 

 

출처 : https://www.oraexcel.com/database-oracle-11gR2-ORA-01795/lang-ko

관련 stackOverflow : https://stackoverflow.com/questions/17842453/is-there-a-workaround-for-ora-01795-maximum-number-of-expressions-in-a-list-is

 

 

 

 

 

728x90
반응형

댓글