우리 회사 데이터베이스를 티베로로 변경하기
SQL을 수정했던 Fail 패턴 2가지 0 0 86,754

by 티베로 티베로전환 [2018.09.30]


가. Column name is ambiguous

서로 다른 테이블이 동일한 이름의 컬럼을 보유하고 있고 해당 컬럼을 SELECT 절에 사용할 경우에는 데이터베이스에게 어떤 테이블에서 보유한 컬럼의 데이터를 추출해야 하는지 테이블 예명(alias)을 통해 명시적으로 알려주어야 한다.

만약 테이블 예명(alias)없이 다음과 같이 컬럼 명만 명시할 경우에는 ‘컬럼의 이름이 애매 모호하다(Column name is ambiguous)’는 SQL Fail이 발생한다.

SELECT B.직원이름
     , 회사코드 <-- 회사(A) 테이블의 컬럼인지 
                   직원(B) 테이블의 것인지 데이터베이스는 알 수 없다.
                   (A.회사코드 혹은 B.회사코드를 명시해야 한다)
  FROM 회사 A
 INNER JOIN 직원 B
    ON A.회사코드 = B.회사코드

만약 소속 회사에서 티베로 도입 이전에 사용했던 외산 DBMS가 위와 같은 형태의 SQL에 대해 모두 에러를 발생시켰다면 개발자가 최초 SQL 작성 시 문제점을 인지하고 수정하였을 것이므로 티베로 전환 과정에서 아무런 문제가 없었을 것이다

그러나 위와 같은 애매모호한(ambiguous) 컬럼을 포함한 일부의 SQL들에 대해 소속 회사가 사용했던 외산 DBMS 버전은 어떠한 이유에서 인지 에러를 발생시키지 않고 정상동작(아마도 A.회사코드=B.회사코드 조건에 의해 데이터가 동일한 것만 추출하므로 두 테이블 중 어떤 것을 불러와도 문제가 없을 것이라고 판단한 것으로 추측된다)하여 티베로 데이터베이스에서는 모두 실패가 발생하였다.

소속 회사에서는 본 사항에 대해 예외 없이 모두 실패가 되어야 하는 것이 보다 합리적인 것이라고 판단하여 모두 테이블 예명(alias)을 명시하는 것으로 SQL을 수정하여 이슈를 처리하였다

나. SUBSTR(XMLAGG ( ... ) .EXTRACT (‘//text()’) .GETCLOBVAL ( ), 2

N개 ROWS로 추출되는 문자열을 특정 컬럼을 기준으로 1개 ROWS로 연결할 때 티베로가 공식 지원하는 함수는 AGGR_CONCAT임을 이미 안내하였다.

또한 티베로는 SQL 호환성을 높이기 위하여 XMLAGG, LISTAGG, WM_CONCAT 등의 기본적인 사용은 지원하지만 WM_CONCAT의 정렬을 위해 PARTITION BY를 이용하는 것과 같은 확장 사용에 대해 SQL Fail이 발생할 수 있는 것도 상위 이슈에서 살펴보았다.

이번에 소개하는 이슈 또한 같은 맥락의 ‘비공식 함수 확장 사용’에 따라 발생한 것인데 본 건의 경우 불행하게도 엔진 패치가 도저히 불가하여 약 50여개의 해당 패턴을 보유한 SQL을 모두 수정하여 이슈를 조치하였다.

소속 회사의 티베로보다 상위 버전에서는 원활히 동작되기를 기대하며 다음과 같이 이슈를 소개한다(문자열 연결 관련 상세 사항은 4.2장 ‘7) 비공식 지원 문자열 연결함수의 과도한 사용’을 참고한다).

  • 1. 기본 형태 : SUBSTR(XMLAGG(XMLELEMENT(x, ‘,’, GUBUN2) ORDER BY ODR).EXTRACT(‘//text()’), 2)
  • 2. 확장 사용 에러(GUBUN2에 해당하는 문자열이 4000Byte가 넘을 경우) : SUBSTR(XMLAGG(XMLELEMENT(x, ‘,’, GUBUN2) ORDER BY ODR). EXTRACT(‘//text( )’).GETCLOBVAL( ), 2)
  • ->소속 회사가 도입한 버전의 티베로는 위 문법을 지원하지 않는다 (JDBC-8008:Missing expression.에러 발생).
  • 3. SQL 수정 : SUBSTR(EXTRACT(XMLAGG(XMLELEMENT(x, ‘,’,GUBUN2) ORDER BY ODR), ‘//text( )’).GETCLOBVAL(),2)
  • -> 위와 같이 티베로가 지원하는 문법으로 수정하였다.

  • [참고 4-6] XMLAGG의 확장 사용
  • SELECT GUBUN1
         , SUBSTR(XMLAGG(XMLELEMENT(x, ',', GUBUN2) 
              ORDER BY ODR).EXTRACT('//text()'), 2) RESULT_XMLAGG
       --, SUBSTR(XMLAGG(XMLELEMENT(x, ',', GUBUN2) 
              ORDER BY ODR).EXTRACT('//text()').GETCLOBVAL(), 2) RESULT_XMLAGG_CLOB
         , SUBSTR(EXTRACT(XMLAGG(XMLELEMENT(x, ',', GUBUN2)
              ORDER BY ODR),'//text()').GETCLOBVAL(),2) RESULT_XMLAGG_CLOB
      FROM (
    		SELECT '부서' GUBUN1, '인사' GUBUN2, '2' ODR FROM DUAL UNION ALL
    		SELECT '부서' GUBUN1, '경영' GUBUN2, '1' ODR FROM DUAL UNION ALL
    		SELECT '부서' GUBUN1, '정보' GUBUN2, '3' ODR FROM DUAL UNION ALL
    		SELECT '부서' GUBUN1, '증권' GUBUN2, '4' ODR FROM DUAL UNION ALL
    		SELECT '부서' GUBUN1, '파생' GUBUN2, '5' ODR FROM DUAL UNION ALL
    		SELECT '팀' GUBUN1, 'IT기획' GUBUN2, '4' ODR FROM DUAL UNION ALL
    		SELECT '팀' GUBUN1, 'IT운영' GUBUN2, '2' ODR FROM DUAL UNION ALL
    		SELECT '팀' GUBUN1, '총무' GUBUN2, '3' ODR FROM DUAL UNION ALL
    		SELECT '팀' GUBUN1, '회계' GUBUN2, '1' ODR FROM DUAL UNION ALL
    		SELECT '팀' GUBUN1, '기획' GUBUN2, '5' ODR FROM DUAL) 
     group by GUBUN1;
        
        
  • XMLAGG의 확장 사용

  • - 해당 강좌는 도서 " [우리 회사 데이터베이스를 티베로로 변경하기]"의 내용을 옮겼습니다.
  • - 해당 도서는 기간계 DBMS(DATABASE MANAGEMENT SYSTEM)를 티베로로 전환하는 실제 프로젝트를 수행한 실무자가 DBMS 전환 과정과 실제 적용 사례, 문제 해결 과정 등을 자세하게 설명하고 있습니다.

- 강좌 URL : http://www.gurubee.net/lecture/4127

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입