it-swarm.asia

Script out Oracle DDL dengan cara otomatis

Oracle SQL Developer dapat mengekspor DDL melalui Tools -> Database Export... Ini bekerja dengan sangat baik, tetapi membutuhkan intervensi manual.

Saya tahu DBMS_METADATA.get_ddl(), tetapi menemukan bahwa ekspornya tidak sempurna. Saya mengalami masalah di mana DBMS_METADATA yang diekspor DDL tidak dapat digunakan tanpa terlebih dahulu memperbaiki masalah seperti jeda di tengah kata kunci, dan lebih buruk. Namun, jika ada yang tahu cara mengekspor DDL melalui DMBS_METADATA yang dapat berjalan tanpa perbaikan manual, itu akan menjadi solusi yang bagus juga.

Pada dasarnya, saya mencari cara otomatis/skrip untuk mengekspor DDL identik ke apa yang diekspor melalui cara manual.

Bagaimana saya bisa melakukan itu?

14
MatthewToday

Nah, jika sqlplus mengacaukan output dbms_metadata.get_ddl Anda, mengapa tidak memilih output dalam CLOB dan menulis CLOB ke filesystem.

misalnya.

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

Ini akan membuat Anda benar DDL, tanpa output menjadi kacau. Satu-satunya hal adalah bahwa skrip akan dibuat pada server DB dan bukan pada klien dari mana Anda memanggil sqlplus.

Script akan disimpan dalam direktori yang ditunjuk oleh entri 'DATA_PUPM_DIR' pada DB Server. yaitu.

select directory_path from all_directories where directory_name like 'DATA_PUMP_DIR';

Terlebih lagi Anda dapat menambahkan semacam iterasi di atas semua tabel/indeks dll dari suatu skema, dan dapatkan DDL skema lengkap dalam waktu singkat. Saya selalu melakukannya.

5
user5294

Alasan Anda mengalami masalah dengan dbms_metadata.get_ddl adalah output CLOBs yang berukuran hingga 4GB. Secara default, SQL * Plus dan Oracle SQL Developer memotong teks panjang sehingga mereka tidak membuang klien dengan sekumpulan besar teks.

Sangat mudah untuk menimpa perilaku ini di SQL * Plus dengan beberapa perintah SET dan mendapatkan DDL bersih.

Skrip yang Anda butuhkan adalah:

-- 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;
6
Nick Chammas

Transformasi berikut dapat membantu. Saya belum menggunakan metode DBMS_XSLPROCESSOR.CLOB2FILE, tetapi saya menggunakannya untuk memigrasi database Oracle dari Solaris ke Linux. Saya tidak bisa menggunakan pompa data karena versi Oracle yang mereka gunakan dan fakta bahwa mereka menggunakan tipe data XML untuk tipe data kolom.

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 );
0
Gandolf989