문제 설명
dbms_metadata.get_ddl을 더 예쁘고 유용하게 만드는 방법 (How to make dbms_metadata.get_ddl more pretty/useful)
내가 할 수 없을 것 같습니다.</p>
출력에 대한 내 문제는 다음과 같습니다.
이름의 큰따옴표
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줄을 더 추가해야 합니다.
</li>begin dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE' , name => 'STACKOVERFLOW') ); end;
인덱스를 사용하는 제약 조건과 인덱스를 동시에 추출하는 방법은 없습니다.
ui_test
의 반복 정의로 인해 출력을 연결할 수 없습니다. 예,get_ddl
에서 제약 조건을 제거하는 옵션이 있지만 제약 조건/검사가 손실되고 있습니다. </ol>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"
PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까? 나는 그들이
dbms_metadata.get_xml
)의 일부 XML 파서를 생성하여 더 예쁜 버전(들여쓰기, 순서, 모든 것이 적절한 위치에 있고 어디에서나 컴파일할 준비가 됨)을 생성했다고 생각합니다.물론입니다. 정규식이나
user_indexes
를 사용할 수 있지만 그게 요점이 아닙니다.ps.
PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까? 나는 그들이DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
은(는) "예쁘다"는 이상한 정의입니다.dbms_metadata.get_xml
)의 일부 XML 파서를 생성하여 더 예쁜 버전(들여쓰기, 순서, 모든 것이 적절한 위치에 있고 어디에서나 컴파일할 준비가 됨)을 생성했다고 생각합니다.</p>물론입니다. 정규식이나
user_indexes
를 사용할 수 있지만 그게 요점이 아닙니다.ps.
PL/SQL Developer와 유사한 출력을 생성하는 방법을 아는 사람이 있습니까? 나는 그들이DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
은(는) "예쁘다"는 이상한 정의입니다.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%'
.METASTYLESHEET ‑ maps a stylesheet to it's name
METAXSL$ ‑ maps an XMLTAG to the stylesheet name ‑ link this to the 1st table
- METAVIEW$ ‑ maps an object type to an XMLTAG ‑ link this to ghe 2nd table
- 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 Turowicz、Arkadiusz Łukasiewicz)
참조 문서