더북(TheBook)

컬럼 값을 세로로 출력

SELECT 문을 사용해 테이블을 조회하면 테이블 형태 그대로 조회되는데, 반대로 컬럼명과 컬럼 값을 세로로 쭉 나열된 형태로 볼 수 있다. 13장에서 DBMS_SQL 패키지를 이용해 만들어 봤던 print_table 프로시저가 그 주인공이다. 꽤 흥미롭고 유용한 프로시저이므로 복습하는 차원에서 다시 만들어보는데 이번에는 print_col_value_prc란 이름으로 만들어 보자.

입력

    CREATE OR REPLACE PACKAGE BODY my_util_pkg IS
    ...
    ...

      PROCEDURE print_col_value_prc ( ps_query IN VARCHAR2 )
      IS
        l_theCursor     INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
        l_columnValue   VARCHAR2(4000);
        l_status        INTEGER;
        l_descTbl       DBMS_SQL.DESC_TAB;
        l_colCnt        NUMBER;
      BEGIN
        -- 쿼리구문이 p_query 매개변수에 들어오므로 이를 파싱한다.
        DBMS_SQL.PARSE(  l_theCursor,  ps_query, DBMS_SQL.NATIVE );

        -- DESCRIBE_COLUMN 프로시저 : 커서에 대한 컬럼정보를 DBMS_SQL.DESC_TAB 형 변수에 넣는다.
        DBMS_SQL.DESCRIBE_COLUMNS  ( l_theCursor, l_colCnt, l_descTbl );

        -- 선택된 컬럼 개수만큼 루프를 돌며 DEFINE_COLUMN 프로시저를 호출해 컬럼을 정의한다.
        FOR i IN 1..l_colCnt
        LOOP
          DBMS_SQL.DEFINE_COLUMN (l_theCursor, i, l_columnValue, 4000);
        END LOOP;

        -- 실행
        l_status := DBMS_SQL.EXECUTE(l_theCursor);

        WHILE ( DBMS_SQL.FETCH_ROWS (l_theCursor) > 0 )
        LOOP
          -- 컬럼 개수만큼 다시 루프를 돌면서 컬럼 값을 l_columnValue 변수에 담는다.
          -- DBMS_SQL.DESC_TAB 형 변수인 l_descTbl.COL_NAME은 컬럼 명칭이 있고
          -- l_columnValue에는 컬럼 값이 들어있다.
          FOR i IN 1..l_colCnt
          LOOP
            DBMS_SQL.COLUMN_VALUE ( l_theCursor, i, l_columnValue );
            DBMS_OUTPUT.PUT_LINE  ( rpad( l_descTbl(i).COL_NAME, 30 ) || ': ' || l_columnValue );
          END LOOP;
          DBMS_OUTPUT.PUT_LINE( '-----------------' );
      END LOOP;

      DBMS_SQL.CLOSE_CURSOR (l_theCursor);
      END print_col_value_prc;
    ...
    ...

결과

    PACKAGE BODY MY_UTIL_PKG이(가) 컴파일되었습니다.

그럼 제대로 동작하는지 print_col_value_prc 프로시저를 실행해 보자. 매개변수로는 다음과 같이 부서 테이블을 조회하는 쿼리를 넣어 보자.

입력

    BEGIN
      -- 부서 테이블 조회
    my_util_pkg.print_col_value_prc ('select * from departments where rownum < 3');
    END;

결과

    DEPARTMENT_ID : 10
    DEPARTMENT_NAME      : 총무기획부
    PARENT_ID            :
    MANAGER_ID           : 200
    CREATE_DATE          : 2014-01-08
    UPDATE_DATE          : 2014-01-08
    -----------------
    DEPARTMENT_ID        : 20
    DEPARTMENT_NAME      : 마케팅
    PARENT_ID            : 10
    MANAGER_ID           : 201
    CREATE_DATE          : 2014-01-08
    UPDATE_DATE          : 2014-01-08
    -----------------

예상했던 대로 부서 테이블에서 2건의 데이터가 출력되었다. 이 프로시저를 유틸리티 프로그램에 포함시킨 이유는 DBMS_SQL 패키지의 사용법을 이해하고 숙달하는 의미도 있고 위 소스를 응용해서 더 멋진 기능을 수행하는 프로그램도 만들 수 있기 때문이다. 예를 들어, 이 프로시저는 컬럼 값을 DBMS_OUTPUT.PUT_LINE을 이용해 출력하고 있는데, 파이프라인 함수 형태로 만들면 SELECT문을 실행해 실제 테이블처럼 조회할 수 있을 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.