एक स्वचालित फैशन में ओरेकल डीडीएल को स्क्रिप्ट करें


14

Oracle SQL Developer DDL को Tools -> Database Export...इस काम के माध्यम से निर्यात करने में सक्षम है , लेकिन इसके लिए मैन्युअल हस्तक्षेप की आवश्यकता होती है।

मुझे पता है DBMS_METADATA.get_ddl(), लेकिन पाया है कि निर्यात सही नहीं है। मैं उन मुद्दों में भाग गया, जहाँ निर्यात किए गए DBMS_METADATADDL पहली बार किसी कीवर्ड के बीच में विराम जैसी समस्याओं को ठीक करने के बिना उपयोग करने योग्य नहीं थे, और इससे भी बदतर। हालाँकि, अगर किसी को पता है DMBS_METADATAकि डीडीएल के माध्यम से निर्यात करने का एक तरीका मैनुअल सुधार के बिना चल सकता है, तो यह भी एक महान समाधान होगा।

असल में, मैं DDL निर्यात करने के लिए एक स्वचालित / स्क्रिप्ट तरीका रहा हूँ समान कौन सी मैन्युअल रास्ता के माध्यम से निर्यात किया जाता है करने के लिए।

मैं उसे कैसे कर सकता हूँ?


1
क्या आप SQLplus के माध्यम से DBMS_METADATA चला रहे हैं? क्या आपके पास अपनी लाइन की चौड़ाई> 80 है?
डेविड मान

मैं SQLPlus का उपयोग कर रहा हूं। क्या इसकी बेहतर उपयोगिता है? क्या आप 'सेट लाइन्स 200' से मतलब रखते हैं? इससे कोई फर्क नहीं पड़ता
मैथोडोडे

2
लगता है दूसरों को भी समस्या थी। Oracle के पुराने संस्करणों में बग, और DBMS_METADATA बनाने में कठिनाई बाद के संस्करणों में अच्छी तरह से खेलते हैं। asktom.oracle.com/pls/asktom/… मेरा समाधान आपके लिए बहुत अच्छा नहीं है। मैं आमतौर पर एक ग्राफिकल टूल (जैसे टॉड) में DBMS_METADATA चलाता हूं और फिर टेक्स्ट डॉक्यूमेंट में कट और पेस्ट करता हूं। निश्चित रूप से स्वचालित नहीं है, लेकिन यह CLOBs अच्छे के साथ लाइन अंत को संभालने के लिए लगता है।
डेविड मान

हम्म्म ऐसा लगता है कि मैं अब के लिए मैनुअल तरीके से चिपके रह सकता हूं ... हालांकि मदद और लिंक के लिए धन्यवाद :)
मैथोडोडे

1
@ डेविड - आपको आउटपुट कॉलम चौड़ाई का उपयोग करने की आवश्यकता है COL, जैसा कि इस उदाहरण में दिखाया गया है , और यह काम करेगा।
निक चामास

जवाबों:


5

ठीक है, अगर sqlplus आपके dbms_metadata.get_ddl आउटपुट को खराब कर रहा है, तो एक CLOB में आउटपुट का चयन क्यों न करें और CLOB को फाइल सिस्टम में लिखें।

जैसे

DECLARE
    data CLOB;
    objType varchar2(30) := 'TABLE';
    objSchema varchar2(30) := 'SCOTT';
    objName varchar2(30) := 'EMP';
    fname varchar2(256) := objType || '_' || objSchema || '_' || objName || '.sql';
BEGIN
    SELECT dbms_metadata.get_ddl(objType,objName,objSchema) into data from dual;
    DBMS_XSLPROCESSOR.CLOB2FILE(data,'DATA_PUMP_DIR',fname);
END;
/

इससे आपको डीडीएल सही होना चाहिए, w / o आउटपुट गड़बड़ हो रहा है। केवल एक चीज यह है कि स्क्रिप्ट डीबी सर्वर पर बनाई जाएगी, न कि उस क्लाइंट पर जहां आप sqlplus को लागू करते हैं।

DB सर्वर पर 'DATA_PUPM_DIR' प्रविष्टि द्वारा इंगित की गई निर्देशिका में स्क्रिप्ट बच जाती है। अर्थात

select directory_path from all_directories where directory_name like 'DATA_PUMP_DIR';

अधिक आप एक स्कीमा के सभी टेबल / इंडेक्स आदि पर कुछ प्रकार की पुनरावृत्ति जोड़ सकते हैं, और कुछ ही समय में पूर्ण स्कीमा का डीडीएल प्राप्त कर सकते हैं। मुझे हर व़क्त यह करना है।


2
ध्यान दें, यह फ़ाइल को सर्वर के फाइल सिस्टम में लिखता है। जो कोई भी ग्राहक मशीन पर डीडीएल प्राप्त करना चाहता है, वह यह हासिल नहीं करेगा।
एंड्रयू स्पेंसर

6

आपके साथ समस्या होने का कारण dbms_metadata.get_ddlयह है कि यह CLOBएस आउटपुट करता है जो आकार में 4 जीबी तक हो सकता है। डिफ़ॉल्ट रूप से, SQL * प्लस और Oracle SQL डेवलपर लंबे टेक्स्ट को काटते हैं, ताकि वे क्लाइंट को टेक्स्ट के बड़े गॉब्स के साथ कचरा न करें।

SQL * प्लस में कुछ SETकमांड के साथ इस व्यवहार को ओवरराइड करना और डीडीएल को साफ करना बहुत आसान है ।

आपके लिए आवश्यक स्क्रिप्ट है:

-- Run this script in SQL*Plus.

-- don't print headers or other crap
set heading off;
set echo off;
set pagesize 0;      

-- don't truncate the line output
-- trim the extra space from linesize when spooling
set long 99999;      
set linesize 32767;  
set trimspool on;    

-- don't truncate this specific column's output
col object_ddl format A32000;

spool sys_ddl.sql;

SELECT dbms_metadata.get_ddl(object_type, object_name, owner) || ';' AS object_ddl
FROM DBA_OBJECTS
WHERE 
      OWNER = 'SYS'
  AND OBJECT_TYPE IN (
      'TABLE'
    , 'INDEX'
    , 'SEQUENCE'
    , 'VIEW'
  )
ORDER BY
    OWNER
  , OBJECT_TYPE
  , OBJECT_NAME
;

spool off;

0

निम्नलिखित परिवर्तनों से मदद मिल सकती है। मैंने DBMS_XSLPROCESSOR.CLOB2FILE विधि का उपयोग नहीं किया है, लेकिन मैंने इनका उपयोग सोलारिस से लिनक्स में ओरेकल डेटाबेस को स्थानांतरित करने के लिए किया है। मैं Oracle के संस्करण के कारण डेटा पंप का उपयोग नहीं कर सका और वे इस तथ्य का उपयोग कर रहे थे कि उन्होंने स्तंभ डेटा प्रकारों के लिए XML डेटा प्रकारों का उपयोग किया था।

DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY',             TRUE );
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR',      TRUE );
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',    FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'OID',                FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE',         TRUE );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.