একটি স্বয়ংক্রিয় ফ্যাশনে ওরাকল ডিডিএলকে স্ক্রিপ্ট আউট করুন


14

ওরাকল এসকিউএল বিকাশকারী Tools -> Database Export...এটির মাধ্যমে খুব ভাল ডিডিএল রফতানি করতে সক্ষম , তবে ম্যানুয়াল হস্তক্ষেপের প্রয়োজন।

আমি জানি DBMS_METADATA.get_ddl(), কিন্তু খুঁজে পেয়েছি যে রফতানিটি নিখুঁত নয়। আমি এমন সমস্যাগুলিতে DBMS_METADATAছুঁড়েছি যেখানে কোনও কীওয়ার্ডের মাঝখানে বিরতির মতো সমস্যাগুলি ঠিক না করে প্রথমে রফতানি করা ডিডিএল ব্যবহারযোগ্য ছিল না এবং আরও খারাপ। তবে, যদি কেউ এর মাধ্যমে ডিডিএল রফতানির কোনও উপায় জানেন তবে DMBS_METADATAম্যানুয়াল ফিক্সগুলি ছাড়াই চলতে পারে, এটিও দুর্দান্ত সমাধান হতে পারে।

মূলত, আমি ম্যানুয়াল উপায়ে যেটি রফতানি হয় তার অনুরূপ ডিডিএল রফতানি করার জন্য একটি স্বয়ংক্রিয় / স্ক্রিপ্টযোগ্য উপায়ের সন্ধান করছি ।

আমি এটা কিভাবে করবো?


1
আপনি কি এসকিউএলপ্লাসের মাধ্যমে ডিবিএমএস_মেটাডাটা চালাচ্ছেন? আপনার কি আপনার লাইনের প্রস্থ সেট> 80?
ডেভিড মান

আমি এসকিউএলপ্লাস ব্যবহার করছি। এর চেয়ে ভাল ইউটিলিটি কি আছে? আপনার কি 'সেট লাইনসাইজ 200' বলতে চাই? এতে কোনও পার্থক্য নেই
ম্যাথুথোডে

2
অন্যদেরও সমস্যা ছিল বলে মনে হয়। ওরাকল এর পূর্ববর্তী সংস্করণগুলিতে বাগ এবং ডিবিএমএস_মেটাডাটা পরবর্তী সংস্করণগুলিতে দুর্দান্তভাবে খেলতে অসুবিধা। asktom.oracle.com/pls/asktom/… আমার সমাধানটি আপনার পক্ষে এত দুর্দান্ত নয়। আমি সাধারণত একটি গ্রাফিকাল সরঞ্জামে (টোডের মতো) ডিবিএমএস_মেটাদ্যাট পরিচালনা করি এবং তারপরে একটি টেক্সট ডকুমেন্টে কেটে পেস্ট করি। অবশ্যই অটোমেটেবল নয়, তবে মনে হচ্ছে এটি সিএলওবিস আরও ভাল করে লাইন শেষ করবে।
ডেভিড মান

হুমম দেখে মনে হচ্ছে আমি আপাতত ম্যানুয়াল পথে স্টিকিং করছি ... সাহায্যের জন্য এবং লিঙ্কের জন্য ধন্যবাদ যদিও :)
ম্যাথুথোডে

1
@David - তুমি আউটপুট কলাম ব্যবহার করে প্রস্থ সেট করতে হবে COL, যেমন দেখানো হয় এই উদাহরণে , এবং এটি কাজ করবে।
নিক চামাস

উত্তর:


5

ঠিক আছে, যদি স্ক্যালপ্লাস আপনার dbms_metadata.get_ddl আউটপুটটি স্ক্রু করছে, তবে কেন একটি সিএলওবিতে আউটপুটটি নির্বাচন করবেন না এবং ফাইলসিস্টিতে সিএলওবি লিখবেন না।

যেমন

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;
/

এটি আপনাকে সঠিক ডিডিএল করা উচিত, ডাব্লু / ও আউটপুট গোলমাল করা। একমাত্র বিষয় হ'ল স্ক্রিপ্টটি ডিবি সার্ভারে তৈরি করা হবে এবং ক্লায়েন্টের উপর নয় যেখানে আপনি স্ক্লাল্প্লাস শুরু করেন।

স্ক্রিপ্টটি 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 গিগাবাইট পর্যন্ত হতে পারে। ডিফল্টরূপে এসকিউএল * প্লাস এবং ওরাকল এসকিউএল বিকাশকারী দীর্ঘ পাঠ্য কেটে দেয় যাতে তারা ক্লায়েন্টকে বড় বড় টুকরো টুকরো টুকরো টুকরো করে না।

এসকিউএল * প্লাসে কয়েকটি 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 পদ্ধতিটি ব্যবহার করি নি, তবে আমি সোলারিস থেকে লিনাক্সে একটি ওরাকল ডাটাবেস স্থানান্তর করতে এগুলি ব্যবহার করেছি। তারা ব্যবহার করছে এমন ওরাকল সংস্করণ এবং কলামের ডেটা ধরণের জন্য তারা এক্সএমএল ডেটা প্রকার ব্যবহার করেছিল বলে আমি ডেটা পাম্পটি ব্যবহার করতে পারিনি।

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 );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.