CLASS

LISTAGG Function (11g New Feature)

일반태그: Application Architecture.DB태그: Oracle. No Comment 2014년 9월 15일 227 (0)

Oracle 11g에서 새롭게 소개된 기능 중, LISTAGG Function에 대해 알아보고자 합니다.

우선 테스트 DB의 Oracle Version 확인 및 샘플 데이터를 생성해 보도록 하겠습니다.

이렇게 생성된 데이터를 확인해 보겠습니다.

이제 이 데이터를 바탕으로, DEPTNO를 GROUP으로 묶은 후 ENAME 값을 가로로 나열하고자 하는데,  10g에서는 이를 구현하기 위해, CONNECT BY 구문을 사용해야 했습니다.

아래의 예제를 살펴보겠습니다.

즉 DEPTNO 값을 GROUPING 하기 위해 ROWNUM() 함수를 사용한 후, CONNECT BY PRIOR를 이용하여 연결한 뒤, SYS_CONNECT_BY_PATH  함수를 사용하여 값을 가로로 나열하였습니다.

하지만, 11g에서는 이를 구현하기 위해서 복잡하게 SQL을 구현할 필요가 없이 LISTAGG 함수를 사용하면 됩니다.

이제 LISTAGG Function이 사용된 여러 Sample을 통해 어떻게 활용이 가능한지 살펴보겠습니다.

사용방법은 간단합니다. GROUPING 하고자 하는 컬럼을 GROUP BY로 묶은 후, 가로로 나열하고자 하는 컬럼을 LASTAGG()에 명시하면 됩니다. 이후, WITHIN GROUP() 함수에서 가로로 나열하고자 하는 순서를 ORDER BY로 지정하면 끝입니다.

그럼 항상 GROUP BY 함수를 사용해야 하나? 10g의 분석함수처럼 여러 컬럼 데이터와 동시에 볼 수는 없을까?

이와 같은 의문에 대해, 아래의 예제에서 확인해 보겠습니다.

Sample #1에서 사용한 LISTAGG 구문에 OVER(PARTITION BY DEPTNO) 구문을 추가할 경우, 분석함수처럼 기존 컬럼들과 같이 볼 수 있습니다.

이번 예제는 LISTAGG 함수의 2번째 파라마터 값을(구분자) 아무것도 안 줄 경우, 모든 값이 연속으로 연결되는 것을 확인할 수 있습니다.

이번에는 이 함수 사용 시 제약사항에 대해 살펴보도록 하겠습니다.

당연한 이야기지만, WITHIN GROUP 함수 파라미터에 값을 주지 않을 경우 에러가 납니다.

이번에는 LISTAGG 함수의 2번째 파라미터에 ROWNUM 같은 예약어는 사용 불가함을 알 수 있습니다.

이번에는 LISTAGG 함수의 2번째 파라미터에 예약어가 아닌 CHR() 함수를 사용할 경우, 에러 없이 출력이 가능한 것을 볼 수 있습니다.

이번 예제는 LISTAGG 함수를 사용하여 String 값을 가져올 때 너무 길이가 긴 값은 가져올 수 없음을 확인할 수 있는 예제입니다. 여기서는 ALL_OBJECTS에서 모든 레코드의 OBJECT_NAME 값을 연결시키고자 했으며, 그 길이가 너무 길어 에러가 났음을 알 수 있습니다.

이상으로 11g에서 새롭게 소개된 LISTAGG 함수에 대해 알아보았습니다.

다음 포스팅 글에서도 11g의 유용한 기능에 대해 소개하고자 하며, 이번 시간에는 여기서 글을 마치도록 하겠습니다.

reference site : http://www.oracle-developer.net/display.php?id=515

Related Posts

Leave a Reply

댓글작성시 Code-Highlighter 삽입방법