it-swarm-eu.dev

Automaticky skriptujte Oracle DDL

Oracle SQL Developer je schopen exportovat DDL prostřednictvím Tools -> Database Export... To funguje velmi dobře, ale vyžaduje ruční zásah.

Vím o DBMS_METADATA.get_ddl(), ale zjistili jsme, že export není dokonalý. Narazil jsem na problémy, kdy exportovaný DBMS_METADATA DDL nebyl použitelný, aniž bych nejprve vyřešil problémy, jako jsou přestávky uprostřed klíčového slova a ještě horší. Pokud však někdo zná způsob exportu DDL prostřednictvím DMBS_METADATA, Který může běžet bez ručních oprav, bylo by to také skvělé řešení.

V zásadě hledám automatický/skriptovatelný způsob exportu DDL identický k tomu, co se exportuje manuálním způsobem.

Jak to mohu udělat?

14
MatthewToday

Pokud tedy sqlplus zašroubuje výstup dbms_metadata.get_ddl, proč nevyberete výstup v CLOB a nezapisujte CLOB do souborového systému.

např.

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

To by vám mělo zajistit správné DDL, bez toho, že by došlo ke zmatení výstupu. Jediná věc je, že skript bude vytvořen na serveru DB a nikoli na klientovi, ze kterého vyvoláte sqlplus.

Skript se uloží do adresáře, na který odkazuje položka „DATA_PUPM_DIR“ na serveru DB. tj.

select directory_path from all_directories where directory_name like 'DATA_PUMP_DIR';

A co víc, můžete přidat nějakou iteraci do všech tabulek/indexů atd. Schématu a získat kompletní DDL schématu v žádném okamžiku. Dělám to pořád.

5
user5294

Důvod, proč máte problémy s dbms_metadata.get_ddl je výstup výstupů CLOBs, které mohou mít velikost až 4 GB. Ve výchozím nastavení zkracují SQL * Plus a Oracle SQL Developer dlouhý text, takže klienty nevyhazují do velkých kapek textu.

Je velmi snadné přepsat toto chování v SQL * Plus pomocí několika příkazů SET a získat čisté DDL.

Skript, který potřebujete, je:

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

Následující transformace mohou pomoci. Nepoužil jsem metodu DBMS_XSLPROCESSOR.CLOB2FILE, ale použil jsem je k migraci databáze Oracle ze systému Solaris do systému Linux. Nemohl jsem použít datové čerpadlo kvůli verzi Oracle, kterou používali, a skutečnosti, že pro datové typy sloupců používali datové typy 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 );
0
Gandolf989