我正在創建一個包來生成架構中的對象的DDL(您解析對象名稱,並返回一個帶有DDL的clob
),所以我可以生成文件並將他們直接進入SVN。如何使dbms_metadata.get_ddl更漂亮/更有用
我使用的是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。爲了解決這個問題,我們需要創建一些對正則表達式或添加像下面這樣可以解決這個問題:
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開發人員創建的輸出
-- 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開發人員輸出?我想他們創建了一些dbms_metadata.get_xml
的XML解析器)來創建一個更漂亮的版本(縮進,順序,所有這些都在好的地方,隨時可以編譯)。
當然,我可以玩正則表達式或user_indexes
,但那不是重點。
ps。 DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
是一個奇怪的定義什麼是「漂亮」。
您可以刪除使用dbms_metadata.set_transform_param架構前綴發現 - 有一個標誌,不顯示或重新映射架構TEST_SCHEMA爲null。 PL/SQL Developer不使用dbms_metadata來生成ddl,所以沒有引號。 – thatjeffsmith