programing

dbms_metadata.get_ddl을 더 예쁘게/유용하게 만드는 방법

i4 2023. 8. 4. 22:39
반응형

dbms_metadata.get_ddl을 더 예쁘게/유용하게 만드는 방법

내 스키마에서 개체의 DDL을 생성하기 위해 패키지를 만들고 있습니다(개체 이름을 구문 분석하고 다음을 반환합니다).clob파일을 생성하여 SVN에 직접 저장할 수 있습니다.

사용 중dbms_metadata.get_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;

다음을 통해 DDL 생성:

begin
   dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE'
                                             , name => 'STACKOVERFLOW')
                        );
end;

다음과 같은 이점이 있습니다.

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" 

사용할 수 있는 모든 관련 인덱스:

begin
   dbms_output.put_line(dbms_metadata.get_dependent_ddl( object_type => 'INDEX'
                                                       , base_object_name => 'STACKOVERFLOW'));
end;

가질 대상:

CREATE INDEX "TEST_SCHEMA"."IDX_TEST" ON "MF"."STACKOVERFLOW" ("COL_1") 
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" 
CREATE UNIQUE INDEX "TEST_SCHEMA"."UI_TEST" ON "MF"."STACKOVERFLOW" ("COL_2") 
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" 

테이블, 제약 조건, 인덱스, 허가(필요한 모든 정의를 가진 하나의 파일) 및 사용을 포함하는 파일을 만들고 싶습니다.dbms_metadata제가 하는 것은 불가능해 보입니다.

출력과 관련된 문제는 다음과 같습니다.

  1. 이름의 이중 따옴표

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

     dbms_metadata.SET_REMAP_PARAM(dbms_metadata.SESSION_TRANSFORM,'REMAP_SCHEMA','TEST_SCHEMA','');
    

    8개 정도의 줄을 더 추가해야 합니다.

    hOpenOrig0 := DBMS_METADATA.OPEN('TABLE');
    DBMS_METADATA.SET_FILTER(hOpenOrig0,'NAME',p_object_name);
    DBMS_METADATA.SET_FILTER(hOpenOrig0,'SCHEMA',get_table.owner);
    tr := dbms_metadata.add_transform(hOpenOrig0, 'MODIFY');
    hTransDDL := DBMS_METADATA.ADD_TRANSFORM(hOpenOrig0,'DDL');
    dbms_metadata.set_remap_param(tr, name => 'REMAP_SCHEMA', old_value => user, new_value => '');
    get_package_spec.ddl := DBMS_METADATA.FETCH_CLOB(hOpenOrig0);
    DBMS_METADATA.CLOSE(hOpenOrig0);
    
  3. 인덱스를 사용하는 제약 조건과 인덱스를 동시에 추출할 수 있는 방법은 없습니다.반복 정의로 인해 출력을 연결할 수 없습니다.ui_test예. 제약 조건을 제거할 수 있는 옵션이 있습니다.get_ddl하지만 우리는 제약을 풀고 있습니다.

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

    -- Create table
    create table STACKOVERFLOW
    (
      col_1 VARCHAR2(64),
      col_2 NUMBER,
      col_3 DATE
    )
    tablespace USERS_DATA_TS
      pctfree 10
      pctused 40
      initrans 1
      maxtrans 255
      storage
      (
        initial 128K
        next 128K
        minextents 1
        maxextents unlimited
        pctincrease 0
      );
    -- Create/Recreate indexes 
    create index IDX_TEST on STACKOVERFLOW (COL_1)
      tablespace USERS_DATA_TS
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 128K
        next 128K
        minextents 1
        maxextents unlimited
        pctincrease 0
      );
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table STACKOVERFLOW
      add constraint UI_TEST unique (COL_2)
      using index 
      tablespace USERS_DATA_TS
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 128K
        next 128K
        minextents 1
        maxextents unlimited
        pctincrease 0
      );
    

PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까?그들이 어떤 XML 파서를 만든 것 같습니다.dbms_metadata.get_xml) 더 예쁜 버전(인텐트, 순서, 모두 좋은 위치, 어디서나 컴파일할 수 있음)을 참조하십시오.

물론 정규식을 가지고 놀 수도 있고,user_indexes하지만 요점은 그게 아니다.

ps.DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);"이상한" 것은 이상한 것인지 이상한 정의입니다.

dbms_module.get_module은 Oracle 개체를 xml로 가져온 다음 xslt를 ddl 스크립트로 변환합니다.

유용한 표 목록select table_name from all_tables where table_name like 'META%'.

  1. MESTATYLESHEET - 스타일시트를 이름에 매핑합니다.

  2. METAXSL$ - XML 태그를 스타일시트 이름에 매핑합니다. 이 태그를 첫 번째 테이블에 연결합니다.

  3. MTAVIEW$ - 개체 유형을 XMLTAG에 매핑합니다. 이 유형을 두 번째 테이블에 연결합니다.
  4. METAXSLPARAM$ - 각 개체 유형 및 변환 유형에 사용할 수 있는 변환 필터에 대한 조회 테이블.

테이블 오라클의 경우 인덱스 오라클의 경우 kable for xml to ddl을 사용하여 kuindex... 등을 사용합니다.

매개 변수를 설정하여 변환 동작을 변경할 수 있습니다.유용한 매개변수를 찾으려면 METAXSLPARAM$ 테이블을 확인하거나 스타일시트 문서에서 검색합니다.EMUTE_SCHEMA - 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;

ddl 내보내기 목적으로 expdp / impdp를 사용하는 것을 제안합니다.

: 스마내기내:faydin다음 expdp를 사용합니다.

expdp userid=faydin/***** directory=ORA_TMP_DIR reuse_dumpfiles=y content=METADATA_ONLY exclude=STATISTICS schemas=faydin dumpfile=metadata.dmp

가져오기 ddlin 가져ddl.sql위해서user : faydin remapped as: faydin3 impdp와 함께

impdp userid=faydin/***** directory=ORA_TMP_DIR dumpfile=metadata.dmp sqlfile=ddl.sql remap_schema=faydin:faydin3

db를 sqlfile=ddl.sql commandimpdp 파일의 입니다.

언급URL : https://stackoverflow.com/questions/33897899/how-to-make-dbms-metadata-get-ddl-more-pretty-useful

반응형