컬럼 값을 세로로 출력
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문을 실행해 실제 테이블처럼 조회할 수 있을 것이다.