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
제가 하는 것은 불가능해 보입니다.
출력과 관련된 문제는 다음과 같습니다.
이름의 이중 따옴표
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);
인덱스를 사용하는 제약 조건과 인덱스를 동시에 추출할 수 있는 방법은 없습니다.반복 정의로 인해 출력을 연결할 수 없습니다.
ui_test
예. 제약 조건을 제거할 수 있는 옵션이 있습니다.get_ddl
하지만 우리는 제약을 풀고 있습니다.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%'
.
MESTATYLESHEET - 스타일시트를 이름에 매핑합니다.
METAXSL$ - XML 태그를 스타일시트 이름에 매핑합니다. 이 태그를 첫 번째 테이블에 연결합니다.
- MTAVIEW$ - 개체 유형을 XMLTAG에 매핑합니다. 이 유형을 두 번째 테이블에 연결합니다.
- 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
'programing' 카테고리의 다른 글
SQL Server Express localdb.msi 오프라인 설치 관리자 (0) | 2023.08.04 |
---|---|
iPhone에 구성 프로필 설치 - 프로그래밍 방식 (0) | 2023.08.04 |
Android - 단추 테두리 (0) | 2023.08.04 |
유연한 항목이 콘텐츠 크기를 넘어서 축소되지 않는 이유는 무엇입니까? (0) | 2023.08.04 |
'경로'의 가져오기 경로를 사용하여 노드의 경로 모듈을 가져올 수 있습니까? (0) | 2023.08.04 |