태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

ORA-01792: maximum number of columns in a table or view is 1000

오라클 2009.09.10 10:36
한 고객사에서 아주 많은 수의 Column을 Fetch하는 긴(하지만 복잡하지 않은) SQL문을 동적으로 생성할 때 이런 에러를 만났습니다.
ORA-01792: maximum number of columns in a table or view is 1000
이 에러를 만날 일이 많지 않습니다. 정체를 보면 다음과 같습니다.
01792
 "maximum number of columns in a table or view is 1000"
// *Cause: An attempt was made to create a table or view with more than 1000
//         columns, or to add more columns to a table or view which pushes
//         it over the maximum allowable limit of 1000. Note that unused
//         columns in the table are counted toward the 1000 column limit.
// *Action: If the error is a result of a CREATE command, then reduce the
//         number of columns in the command and resubmit. If the error is
//         a result of an ALTER TABLE command, then there are two options:
//         1) If the table contained unused columns, remove them by executing
//            ALTER TABLE DROP UNUSED COLUMNS before adding new columns;
//         2) Reduce the number of columns in the command and resubmit.
문제는 어떤 Table도 1000개 이상의 Column을 갖고 있지 않다는 것입니다. 그렇다면 문제는 무엇일까요?

에러의 정의를 잘 보면 Table뿐만 아니라 View도 1000개 이상의 Column을 갖지 못한다는 것입니다. 고객사에 요청해서 SQL문을 보내달라고 했습니다. 이런 패턴이었습니다.

select * from (
   select b, 
       decode(a, 1, 1) as c1,
       decode(a, 2, 2) as c2,
       ...
       decode(a, 1000, 1000) as c1000
   from t1
) 
  • SQL문을 동적으로 생성하는 과정에서 (아마도 불필요한) Inline View를 선언하고 있습니다.
  • Inline View는 절묘하게 1,000개를 살짝 넘는 Column을 동적으로 선업합니다.
간단한 테스트를 통해 이것을 증명해보겠습니다.

다음과 같이 Inline View내에서 1,000개 이상의 Column을 동적으로 선언하는 경우에는 ORA-01792 에러가 발생합니다.

UKJA@ukja1021> declare
  2  	     v_cursor	     sys_refcursor;
  3  	     v_sql		     varchar2(32767);
  4  begin
  5  	     v_sql := 'select * from (select ';
  6  	     for idx in 1 .. 1000 loop
  7  		     v_sql := v_sql || rpad('1',10, '1')  || ' as c'|| idx || ', ';
  8  	     end loop;
  9  	     v_sql := v_sql || '1  from dual)';
 10  
 11  	     open v_cursor for v_sql;
 12  	     close v_cursor;
 13  end;
 14  /
declare
*
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 1000
ORA-06512: at line 11
하지만 Inline View를 없앤 경우에는 정상적으로 수행됩니다.
Elapsed: 00:00:00.06
UKJA@ukja1021> 
UKJA@ukja1021> declare
  2  	     v_cursor	     sys_refcursor;
  3  	     v_sql		     varchar2(32767);
  4  begin
  5  	     v_sql := 'select ';
  6  	     for idx in 1 .. 1000 loop
  7  		     v_sql := v_sql || rpad('1',10, '1')  || ' as c'|| idx || ', ';
  8  	     end loop;
  9  	     v_sql := v_sql || '1  from dual';
 10  
 11  	     open v_cursor for v_sql;
 12  	     close v_cursor;
 13  end;
 14  /

PL/SQL procedure successfully completed.
한가지 문제는 1,000개의 제한을 판단하는 단계가 Optimization의 단계가 아니라 Parse 단계, 즉 Syntax 확인 단계라는 것입니다. 따라서 MERGE 힌트등을 통해 Inline View를 강제로 없앤다고 해도 ORA-01792 에러를 피할 수는 없습니다.

다행히 이 경우에는 불필요한 Inline View를 없애는 것으로 간단한게 해결할 수 있었지만, 그렇지 않았다면 상당히 골치아픈 문제가 되었을겁니다.

저작자 표시
신고
tags :
Trackback 0 : Comment 1
  1. extremedb 2009.09.10 13:21 신고 Modify/Delete Reply

    재미있는 에러입니다.
    인라인뷰에서도 컬럼이 1000개가 넘어가면 에러가 나는군요.
    좋은 정보 감사드립니다.

Write a comment

티스토리 툴바