2015-11-24 8 views
13

मैं अपनी स्कीमा में ऑब्जेक्ट्स के डीडीएल उत्पन्न करने के लिए एक पैकेज बना रहा हूं (आप ऑब्जेक्ट नाम को पार्स करते हैं, और 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 अंदर

  • स्कीमा नाम नाम की

    1. डबल उद्धरण हमें कई स्कीमा में एक ही 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); 
      
    2. कोई तरीका नहीं है एक ही पल में बाधाओं को निकालने (जो इंडेक्स का उपयोग करें) और इंडेक्स निकालने का। ui_test की परिभाषा को दोहराने के कारण आप आउटपुट को संयोजित नहीं कर सकते हैं। हां get_ddl से बाधाओं को दूर करने का विकल्प है, लेकिन हम बाधा/जांच खो रहे हैं।

    3. कैसे 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); एक अजीब परिभाषा है जो "सुंदर" है।

  • +0

    आप dbms_metadata.set_transform_param का उपयोग कर स्कीमा उपसर्गों को हटा सकते हैं में पाया है - वहाँ एक झंडा नहीं दिखा करने के लिए या स्कीमा TEST_SCHEMA पुन: मैप करने के लिए शून्य पर है। पीएल/एसक्यूएल डेवलपर डीडीएल उत्पन्न करने के लिए dbms_metadata का उपयोग नहीं करता है, इसलिए वहां कोई उद्धरण नहीं है। – thatjeffsmith

    उत्तर

    -2

    क्या मैं आपको डीडीएल निर्यात उद्देश्यों के लिए expdp/impdp का उपयोग करने का सुझाव दे सकता हूं।

    निर्यात स्कीमा: faydin निम्नलिखित expdp के साथ।

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

    प्राप्त impdp साथ user : faydin remapped as: faydin3 के लिए ddl.sql में DDL

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

    आयात स्कीमा impdp आदेश में sqlfile=ddl.sql वाक्यांश को हटाने करके डीबी करने के लिए।

    7

    dbms_metadata.get_dll ऑरकल ऑब्जेक्ट को xml के रूप में प्राप्त करता है और इसे xslt से ddl स्क्रिप्ट में बदल देता है।

    उपयोगी तालिका select table_name from all_tables where table_name like 'META%' की सूची।

    1. METASTYLESHEET - यह करने के लिए एक स्टाइलशीट नाम

      के नक्शे
    2. METAXSL $ - नक्शे स्टाइलशीट नाम के लिए एक XMLTAG - 1 टेबल को यह लिंक

    3. METAVIEW $ - एक के लिए एक ऑब्जेक्ट प्रकार के नक्शे XMLTAG - इसे दूसरी तालिका
    4. METAXSLPARAM $ - प्रत्येक ऑब्जेक्ट प्रकार और ट्रांसफ़ॉर्म प्रकार के लिए उपलब्ध ट्रांसफॉर्म फ़िल्टर के लिए लुकअप तालिका से लिंक करें। एक्सएमएल एक सूचकांक ओरेकल के लिए DDL के लिए

    एक मेज ओरेकल के लिए kutable का उपयोग करता kuindex का उपयोग करता है ... आदि

    मानकों की स्थापना आप परिवर्तन के व्यवहार को बदल सकते हैं। उपयोगी पैरामीटर खोजने के लिए METAXSLPARAM $ तालिका जांचें या स्टाइल शीट दस्तावेज़ों में इसे खोजें। EMIT_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; 
    
    +0

    वास्तव में सहायक। निश्चित रूप से यह मेरी समस्याओं का हिस्सा हल करता है ('' ईएमआईटी-स्मेमा ') जिसे मैंने 'regexp' के साथ तय किया है ... यह मेरी समस्याओं को पूरी तरह हल नहीं करता है लेकिन मैं सभी पैरामीटर –

    +0

    दुर्भाग्य से देखता हूं वास्तव में कुछ भी नहीं है emit-schema के अलावा दिलचस्प ... और अधिक जांचना मुझे get_dll के साथ और भी समस्याएं मिलीं ... मुझे लगता है कि मुझे सीधे ओरेकल –

    +0

    पर कुछ टिकट उठाना होगा, यह भी ध्यान दें कि 'SEGMENT_CREATION' अब 12i (थ्रू) के साथ उपलब्ध नहीं है यहां एक त्रुटि)। इसके अलावा मुझे 'get_ddl' के साथ 'COMMENT ON' याद आती है - साथ ही यह परेशान करता है कि कई कथन (' तालिका बनाएं' ... 'वैकल्पिक तालिका') 'CONSTRAINTS_AS_ALTER' के साथ उत्पन्न होते हैं, लेकिन ठीक से अलग नहीं होते हैं (एक अर्धविराम नहीं मिला)। क्या कोई अन्य पैरामीटर गुम है, जैसे 'dbms_metadata.set_transform_param (dbms_metadata.session_transform,' SQLTERMINATOR ', सत्य); '? ;) – Izzy

    संबंधित मुद्दे