dbms_metadata.get_ddl을 더 예쁘고 유용하게 만드는 방법 (How to make dbms_metadata.get_ddl more pretty/useful)


문제 설명

dbms_metadata.get_ddl을 더 예쁘고 유용하게 만드는 방법 (How to make dbms_metadata.get_ddl more pretty/useful)

내가 할 수 없을 것 같습니다.</p>

출력에 대한 내 문제는 다음과 같습니다.

  1. 이름의 큰따옴표

  2. DDL 내부의 스키마 이름은 많은 스키마에서 동일한 DDL을 컴파일하기 어렵게 만듭니다. 이 문제를 수정하려면 정규식에 대한 일부를 생성하거나 다음과 같은 것을 추가해야 수정할 수 있습니다.

    create table stackoverflow
    ( col_1 varchar2(64)
    , col_2 number
    , col_3 date);

    create index idx_test on stackoverflow(col_1);

    alter table stackoverflow add constraint ui_test unique (col_2) using index;
    </code></pre>

    하지만 8줄을 더 추가해야 합니다.

    begin
       dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE'
                                                 , name => 'STACKOVERFLOW')
                            );
    end;
    
    </li>
  3. 인덱스를 사용하는 제약 조건과 인덱스를 동시에 추출하는 방법은 없습니다. ui_test의 반복 정의로 인해 출력을 연결할 수 없습니다. 예, get_ddl에서 제약 조건을 제거하는 옵션이 있지만 제약 조건/검사가 손실되고 있습니다.

  4. PL/SQL Developer가 출력을 생성하는 방법

    CREATE TABLE "TEST_SCHEMA"."STACKOVERFLOW" 
     (  "COL_1" VARCHAR2(64), 
      "COL_2" NUMBER, 
      "COL_3" DATE, 
       CONSTRAINT "UI_TEST" UNIQUE ("COL_2")
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "USERS_DATA_TS"  ENABLE
     ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
    NOCOMPRESS LOGGING
    STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "USERS_DATA_TS" 
    
  5. </ol>

    PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까? 나는 그들이 dbms_metadata.get_xml)의 일부 XML 파서를 생성하여 더 예쁜 버전(들여쓰기, 순서, 모든 것이 적절한 위치에 있고 어디에서나 컴파일할 준비가 됨)을 생성했다고 생각합니다.

    물론입니다. 정규식이나 user_indexes를 사용할 수 있지만 그게 요점이 아닙니다.

    ps. DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);은(는) "예쁘다"는 이상한 정의입니다.

    PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까? 나는 그들이 dbms_metadata.get_xml)의 일부 XML 파서를 생성하여 더 예쁜 버전(들여쓰기, 순서, 모든 것이 적절한 위치에 있고 어디에서나 컴파일할 준비가 됨)을 생성했다고 생각합니다.</p>

    물론입니다. 정규식이나 user_indexes를 사용할 수 있지만 그게 요점이 아닙니다.

    ps. DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);은(는) "예쁘다"는 이상한 정의입니다.

    PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까? 나는 그들이 dbms_metadata.get_xml)의 일부 XML 파서를 생성하여 더 예쁜 버전(들여쓰기, 순서, 모든 것이 적절한 위치에 있고 어디에서나 컴파일할 준비가 됨)을 생성했다고 생각합니다.</p>

    물론입니다. 정규식이나 user_indexes를 사용할 수 있지만 그게 요점이 아닙니다.

    ps. DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);은(는) "예쁘다"는 이상한 정의입니다.

    물론 정규식이나 user_indexes로 재생할 수 있지만 그게 요점이 아닙니다.</p>

    ps. DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);은(는) "예쁘다"는 이상한 정의입니다.

    물론 정규식이나 user_indexes로 재생할 수 있지만 그게 요점이 아닙니다.</p>

    ps. DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);은(는) "예쁘다"는 이상한 정의입니다.


    참조 솔루션

    방법 1:

    dbms_metadata.get_dll gets oracle object as xml and next transform it by xslt to ddl script.

    List of useful table select table_name from all_tables where table_name like 'META%'.

    1. METASTYLESHEET ‑ maps a stylesheet to it's name

    2. METAXSL$ ‑ maps an XMLTAG to the stylesheet name ‑ link this to the 1st table

    3. METAVIEW$ ‑ maps an object type to an XMLTAG ‑ link this to ghe 2nd table
    4. METAXSLPARAM$ ‑ lookup table for the transform filters available for each object type and transform type.

    For a table oracle uses kutable for xml to ddl for a index oracle uses kuindex ... etc.

    By setting parameters you can change behavior of transformation. To find useful parameter check METAXSLPARAM$ table or search it in style sheet documents. EMIT_SCHEMA ‑ i have found in kucommon xslt

    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'EMIT_SCHEMA',false);  ‑‑undocumented remove schema
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_CREATION',false);  ‑‑undocumented remove segement creation
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'CONSTRAINTS_AS_ALTER',true);
    select dbms_metadata.get_ddl( object_type => 'TABLE' , name => 'STACKOVERFLOW') from dual;
    

    (by Patryk TurowiczArkadiusz Łukasiewicz)

    참조 문서

    1. How to make dbms_metadata.get_ddl more pretty/useful (CC BY‑SA 2.5/3.0/4.0)

#DDL #oracle #dbms-metadata #plsqldeveloper






관련 질문

비밀번호로 식별되지 않는 mysql 부여 권한 (mysql grant privileges without identified by password)

PL/SQL 블록의 문자열 변수에서 사용자 생성 (Create user from string variables in a PL/SQL block)

dbms_metadata.get_ddl을 더 예쁘고 유용하게 만드는 방법 (How to make dbms_metadata.get_ddl more pretty/useful)

Postgres에서 테이블의 모든 인덱스를 삭제하려면 어떻게 해야 합니까? (How can I drop all indexes of a table in Postgres?)

DB2의 카탈로그에서 "처음에 기록되지 않은" 테이블을 식별하는 방법 (How to identify tables with "not logged initially" from catalog in DB2)

blob 및 clob 데이터 유형이 있는 oracle11g에 테이블을 생성한 다음 다음 쿼리를 실행했습니다. (I have create table in oracle11g which has blob and clob data type and then I have run following query)

PL/pgsql DDL을 작성하여 redshift에서 스키마를 생성한 다음 ddls를 반복하여 각 스키마에 테이블을 생성하는 방법은 무엇입니까? (How to write PL/pgsql DDL to create schemas in redshift and then looping the ddls to create tables in the respective schemas?)

즉시 실행으로 디렉토리 객체를 생성하려고 할 때 ORA-00900 Invalid SQL 문을 받는 이유는 무엇입니까? (Why am I getting ORA-00900 Invalid SQL statement when trying to create a directory object with execute immediate?)

SQLAlchemy: 부분적으로 지정된 관계 (SQLAlchemy: partially specified relationship)

T-SQL의 한 스크립트에서 동일한 열 정의로 두 개의 테이블을 만드는 방법은 무엇입니까? (How to create two tables with same column definition in one script in T-SQL?)

지리 데이터 유형에서 네이티브 함수 반환 (Native Function Return from Geography Data Type)

Oracle - 커서를 기반으로 테이블 삭제를 위한 동적 함수 생성 (Oracle- creating dynamic function for deleting tables based on cursor)







코멘트