मैं अपनी स्कीमा में ऑब्जेक्ट्स के डीडीएल उत्पन्न करने के लिए एक पैकेज बना रहा हूं (आप ऑब्जेक्ट नाम को पार्स करते हैं, और clob
डीडीएल के साथ वापस लौटाते हैं), इसलिए मैं फाइलें उत्पन्न कर सकता हूं, और डाल सकता हूं उन्हें सीधे एसवीएन में।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;
के लिए:, की कमी, अनुक्रमित, अनुदान (सभी परिभाषा की जरूरत के साथ एक फ़ाइल के लिए) और dbms_metadata
का उपयोग कर यह मुझे करने के लिए असंभव लग रहा है बनाने तालिका:
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"
मैं एक फ़ाइल है कि बनाना चाहते हैं ।
उत्पादन के साथ मेरी समस्या है: 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 डेवलपर उत्पादन
-- 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
का कुछ एक्सएमएल पार्सर बनाया है) एक और सुंदर संस्करण (इंडेंट्स, ऑर्डर, सभी अच्छी जगह पर, कहीं भी संकलित करने के लिए तैयार) बनाने के लिए।
बेशक मैं regexes या user_indexes
के साथ खेल सकता हूं लेकिन यह बात नहीं है।
ps। DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
एक अजीब परिभाषा है जो "सुंदर" है।
आप dbms_metadata.set_transform_param का उपयोग कर स्कीमा उपसर्गों को हटा सकते हैं में पाया है - वहाँ एक झंडा नहीं दिखा करने के लिए या स्कीमा TEST_SCHEMA पुन: मैप करने के लिए शून्य पर है। पीएल/एसक्यूएल डेवलपर डीडीएल उत्पन्न करने के लिए dbms_metadata का उपयोग नहीं करता है, इसलिए वहां कोई उद्धरण नहीं है। – thatjeffsmith