본문 바로가기
ORACLE

테이블정의서 HTML 변환과정

by MMXVI 2022. 10. 14.
728x90
반응형
SMALL
반응형

[오라클]    테이블정의서 HTML 변환과정 

 첨부파일 ▼

 

 

 

 

 

 

SET SERVEROUTPUT ON;

DECLARE
    TYPE TYPE_VARCHAR2 IS TABLE OF VARCHAR2(4000);
    V_TABLE_NAME TYPE_VARCHAR2;
    V_TABLE_COMT TYPE_VARCHAR2;
    V_CNT NUMBER;
    V_MAX_PX NUMBER;
    V_SQL VARCHAR2(4000);
    V_VERSION VARCHAR2(100);
BEGIN
    V_VERSION := 'ESTDB_10.0.12';

    SELECT A.TABLE_NAME,
           REGEXP_SUBSTR(B.COMMENTS, '[^|]+', 1, 1) AS CMT
    BULK COLLECT INTO V_TABLE_NAME, V_TABLE_COMT
    FROM USER_TABLES A
    JOIN USER_TAB_COMMENTS B ON B.TABLE_NAME = A.TABLE_NAME
    ORDER BY A.TABLE_NAME;

    DBMS_OUTPUT.PUT_LINE('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
    DBMS_OUTPUT.PUT_LINE('<html>');
    DBMS_OUTPUT.PUT_LINE('<head>');
    DBMS_OUTPUT.PUT_LINE('    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />');
    DBMS_OUTPUT.PUT_LINE('    <title>' || V_VERSION || '</title>');
    DBMS_OUTPUT.PUT_LINE('    <style type="text/css">');
    DBMS_OUTPUT.PUT_LINE('        .entity{');
    DBMS_OUTPUT.PUT_LINE('            border: solid 1px #7E2828;');
    DBMS_OUTPUT.PUT_LINE('            margin-bottom: 20px;');
    DBMS_OUTPUT.PUT_LINE('            font-size:10pt;');
    DBMS_OUTPUT.PUT_LINE('            line-height:16pt;');
    DBMS_OUTPUT.PUT_LINE('        }');
    DBMS_OUTPUT.PUT_LINE('        .header{');
    DBMS_OUTPUT.PUT_LINE('            background-color: #7E2828;');
    DBMS_OUTPUT.PUT_LINE('            color: white;');
    DBMS_OUTPUT.PUT_LINE('        }');
    DBMS_OUTPUT.PUT_LINE('        .column-header{');
    DBMS_OUTPUT.PUT_LINE('            background-color: #E8E8E8;');
    DBMS_OUTPUT.PUT_LINE('        }');
    DBMS_OUTPUT.PUT_LINE('        td{');
    DBMS_OUTPUT.PUT_LINE('            padding-left: 5px;');
    DBMS_OUTPUT.PUT_LINE('            padding-right: 5px;');
    DBMS_OUTPUT.PUT_LINE('        }');
    DBMS_OUTPUT.PUT_LINE('    </style>');
    DBMS_OUTPUT.PUT_LINE('</head>');
    DBMS_OUTPUT.PUT_LINE('<body>');
    DBMS_OUTPUT.PUT_LINE('<h2>' || V_VERSION || ' </h2>');

    FOR I IN V_TABLE_NAME.FIRST .. V_TABLE_NAME.LAST LOOP

        SELECT MAX(A.COLUMN_ID) AS CNT,
               (MAX(LENGTH(COLUMN_NAME)) * 14) AS MAX_PX
        INTO V_CNT, V_MAX_PX
        FROM USER_TAB_COLS A
        WHERE A.TABLE_NAME = V_TABLE_NAME(I);

        DBMS_OUTPUT.PUT_LINE('<font size="2"><table class="entity" cellpadding="0" cellspacing="0" width="100%" style="word-break:break-all;">');
        DBMS_OUTPUT.PUT_LINE('<tr>');
        DBMS_OUTPUT.PUT_LINE('    <td colspan="5" class="header">' || V_TABLE_NAME(I) || ' (' || V_TABLE_COMT(I) || ')</td>');
        DBMS_OUTPUT.PUT_LINE('</tr>');
        DBMS_OUTPUT.PUT_LINE('<tr class="column-header">');
        DBMS_OUTPUT.PUT_LINE('    <td>컬럼 설명</td>');
        DBMS_OUTPUT.PUT_LINE('    <td>컬럼명</td>');
        DBMS_OUTPUT.PUT_LINE('    <td>데이터타입</td>');
        DBMS_OUTPUT.PUT_LINE('    <td ALIGN="CENTER">Not Null</td>');
        DBMS_OUTPUT.PUT_LINE('    <td>비고</td>');
        DBMS_OUTPUT.PUT_LINE('</tr>');

        FOR J IN 1 .. V_CNT LOOP
            SELECT '    <tr>' || CHR(10) ||
                   '        <td WIDTH="' || V_MAX_PX * 1.5 || '">' || A.LG || '</td>' || CHR(10) ||
                   '        <td WIDTH="' || V_MAX_PX || '">' || A.COLUMN_NAME || '</td>' || CHR(10) ||
                   '        <td WIDTH="120">' || A.DATA_TYPE || '</td>' || CHR(10) ||
                   '        <td WIDTH="100" ALIGN="CENTER">' || A.NOTNULL || '</td>' || CHR(10) ||
                   '        <td>' || A.COMMENTS || '</td>' || CHR(10) ||
                   '    </tr>'
            INTO V_SQL
            FROM (
                SELECT 
                    REGEXP_SUBSTR(B.COMMENTS, '[^|]+', 1, 1) ||
                    CASE WHEN C.COLUMN_NAME IS NOT NULL THEN '(PK)' END AS LG,
                    A.COLUMN_NAME,
                    A.DATA_TYPE ||
                        CASE 
                            WHEN A.DATA_TYPE IN ('CHAR', 'VARCHAR2', 'NVARCHAR2') THEN '(' || A.DATA_LENGTH || ')'
                            WHEN A.DATA_TYPE = 'NUMBER' AND A.DATA_SCALE = 0 AND A.DATA_PRECISION IS NOT NULL THEN '(' || A.DATA_PRECISION || ')'
                            WHEN A.DATA_TYPE = 'NUMBER' AND A.DATA_SCALE <> 0 THEN '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')'
                        END AS DATA_TYPE,
                    DECODE(A.NULLABLE, 'Y', 'N', 'N', 'Y') AS NOTNULL,
                    B.COMMENTS
                FROM USER_TAB_COLS A
                JOIN USER_COL_COMMENTS B ON A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME
                LEFT JOIN (
                    SELECT C.TABLE_NAME, C.COLUMN_NAME
                    FROM USER_IND_COLUMNS C
                    WHERE EXISTS (
                        SELECT 1 FROM USER_CONSTRAINTS S
                        WHERE S.CONSTRAINT_TYPE = 'P'
                          AND S.TABLE_NAME = C.TABLE_NAME
                          AND S.INDEX_NAME = C.INDEX_NAME
                    )
                ) C ON A.TABLE_NAME = C.TABLE_NAME AND A.COLUMN_NAME = C.COLUMN_NAME
                WHERE A.COLUMN_NAME != 'HIW_SOLUTION_TPCODE'
                  AND A.TABLE_NAME = V_TABLE_NAME(I)
                  AND A.COLUMN_ID = J
            ) A;

            DBMS_OUTPUT.PUT_LINE(V_SQL);
            V_SQL := NULL;
        END LOOP;

        DBMS_OUTPUT.PUT_LINE('</table>');
        V_CNT := 0;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE('</body>');
    DBMS_OUTPUT.PUT_LINE('</html>');
END;
/

728x90

 

테이블정의서변환.sql
0.01MB

 

 

 

728x90
반응형
LIST

'ORACLE' 카테고리의 다른 글

오라클 db exp 백업  (0) 2023.03.29
[오라클]사용자 권한 추가 테이블스페이스 추가  (0) 2023.02.10

댓글