пятница, 9 марта 2012 г.

Extract Oracle DDL to File

Простой скрипт для выгрузки DDL-кода Oracle-объекта в файл.

GenDDL.sql:
SET TERMOUT OFF
SET VERIFY OFF
SET ECHO OFF
SET LONG 9000000
SET LONGC 900
SET LINES 400
SET TRIMSPOOL ON
SET PAGES 0
SET FEEDBACK OFF
SET HEAD OFF
SET SQLBLANKLINES OFF
SET SERVEROUTPUT ON

BEGIN
   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,
                                      'SEGMENT_ATTRIBUTES',
                                      FALSE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'STORAGE',
                                      FALSE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'TABLESPACE',
                                      FALSE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'REF_CONSTRAINTS',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'SPECIFICATION',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'BODY',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'CONSTRAINTS',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'STORAGE',
                                      TRUE);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform,
                                      'CONSTRAINTS_AS_ALTER',
                                      TRUE);
END;
/

SPOOL '&&3'

BEGIN
   FOR i IN (SELECT owner,
                    object_type,
                    object_name,
                    created d
               FROM all_objects
              WHERE owner = '&&1' AND object_name = '&&2')
   LOOP
      DBMS_OUTPUT.Put_Line (
         DBMS_METADATA.get_ddl (REPLACE (i.object_type, ' ', '_'),
                                i.object_name,
                                i.owner));
   END LOOP;
END;
/

SPOOL OFF

EXIT
Используется 3 входных параметра:
1) Пользователь (схема);
2) Объект;
3) Файл для выгрузки.

Пример запуска:
rlwrap sqlplus -silent=true objectman@XE/objectman @/home/maksim/projects/AntOraDDL/GenDDL.sql OBJECTMAN MYBOOKS /home/maksim/projects/AntOraDDL/mybooks.sql

3 комментария:

  1. А есть скрипт выгрузки всей схемы?
    для последующей загрузки в контроллер версий

    ОтветитьУдалить
  2. Готового под рукой нет, но вариантов несколько:
    1. Можно убрать строчку "AND object_name = '&&2'", тогда в указанный файл выгрузится DDL всех объектов схемы;
    2. Если нужно выгружать каждый объект в свой файл (как для СКВ в вашем случае), то можно заранее sql-скриптом сгенерировать bat-ник, bash-сценарий (или что-нибудь еще), который будет дергать вышеуказанный скрипт с нужными параметрами.
    3. Если есть доступ к ФС, где база работает, то там еще проще.
    4. Есть еще утилитка интересная http://code.google.com/p/oracle-ddl2svn/, хоть там все и готово, но она имеет ряд своих ограничений.

    Будут вопросы - обращайтесь.

    ОтветитьУдалить
  3. А чего в утилите oracle-ddl2svn не хватает? Я ее автор :)
    Если чего нужно - пишите в багтрекер, подумаю.
    Баг http://code.google.com/p/oracle-ddl2svn/issues/detail?id=38 от Pavel.Pimenov видел, но не знаю когда до него доберусь.

    Один американец мне в коммитеры присоеденился как-то, если хотите - добавлю тоже, доделаете под себя и поделитесь с сообществом.

    ОтветитьУдалить