더북(TheBook)

테이블 레이아웃 출력

이번에는 테이블명을 입력받아 테이블 레이아웃을 출력하는 프로시저를 만들어 보자. 테이블에 대한 정보는 ALL_TABLES, ALL_TAB_COLS 뷰를 참조해 얻을 수 있는데, 이 정보를 활용해 table_layout_prc라는 프로시저를 만들어 보자.

입력

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

      -- 테이블 Layout 출력
      PROCEDURE table_layout_prc ( ps_table_name IN VARCHAR2)
      IS
        vs_table_name VARCHAR2(50) := UPPER(ps_table_name);
        vs_owner      VARCHAR2(50);
        vs_columns    VARCHAR2(300);
      BEGIN
      BEGIN
        -- 테이블이 있는지 검색
        SELECT OWNER
          INTO vs_owner
          FROM ALL_TABLES
         WHERE TABLE_NAME = vs_table_name;
        -- 해당 테이블이 없으면 빠져 나간다.
        EXCEPTION WHEN NO_DATA_FOUND THEN
           DBMS_OUTPUT.PUT_LINE(vs_table_name || '라는 테이블이 존재하지 않습니다');
           RETURN;
        END;
        -- 테이블명 출력
        DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------');
        DBMS_OUTPUT.PUT_LINE('테이블: ' || vs_table_name || ' , 소유자 : ' || vs_owner);
        DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------');

        -- 컬럼정보 검색 및 출력
        FOR C_CUR IN ( SELECT column_name, data_type, data_length, nullable, data_default
                         FROM ALL_TAB_COLS
                        WHERE table_name = vs_table_name
                        ORDER BY column_id;
                      )
        LOOP
           -- 컬럼 정보를 출력한다. 줄을 맞춰 출력되도록 RPAD 함수를 사용한다.
           vs_columns := RPAD(C_CUR.column_name, 20) || RPAD(C_CUR.data_type, 15) || RPAD(C_CUR.data_length, 5) || RPAD(C_CUR.nullable, 2) || RPAD(C_CUR.data_default, 10);
           DBMS_OUTPUT.PUT_LINE( vs_columns);
        END LOOP;
      END table_layout_prc;

결과

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

이 프로시저는 테이블 명을 매개변수로 입력받아 먼저 ALL_TABLES 뷰를 참조해 해당 테이블이 있는지 검색한다. 없으면 오류 메시지를 출력한 후 프로시저를 빠져 나오고, 테이블이 존재하면 다시 ALL_TAB_COLS 뷰를 검색해 해당 테이블의 컬럼 정보(컬럼명, 데이터 타입, 데이터 길이, NULL 허용여부, DEFAULT 값)를 읽어 출력하고 있다. 출력하는 컬럼명의 길이가 제각각이므로 줄을 맞춰 출력하기 위해 RPAD 함수를 사용하고 있다. 그럼 프로시저를 실행해 보자.

입력

    BEGIN
      -- 부서 테이블명 입력
      my_util_pkg.table_layout_prc ('departments');
    END;

결과

    -------------------------------------------------------
    테이블: DEPARTMENTS , 소유자 : ORA_USER
    -------------------------------------------------------
    DEPARTMENT_ID         NUMBER         22    N
    DEPARTMENT_NAME       VARCHAR2       80    N
    PARENT_ID             NUMBER         22    Y
    MANAGER_ID            NUMBER         22    Y
    CREATE_DATE           DATE            7    Y SYSDATE
    UPDATE_DATE           DATE            7    Y SYSDATE

컬럼 외에 인덱스 정보까지 출력하고 싶다면 ALL_INDEXES와 ALL_IND_COLUMNS 뷰를 참조하면 출력할 수 있다. 참고로 만약 테이블 생성 스크립트를 얻고자 한다면 DBMS_METADATA.GET_DDL 함수를 사용하면 된다.

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