Wie erhalte ich ein Oracle SCHEMA als DDL-Skript mit DBMS_METADATA (und SCHEMA_EXPORT)?

Ich habe Probleme, die DDL für ein bestimmtes Schema mit DBMS_METADATA zu extrahieren, wahrscheinlich, weil ich es falsch verstanden habe.

Hier ist was ich im Grunde tue:

set termout off

create table copy_dml_schema(c clob, i number);

declare

  m    number;
  t    number;
  e    number;
  c    clob;
  i    number := 0;

begin

  e   :=  dbms_metadata.session_transform;


  dbms_metadata.set_transform_param   (e, 'REF_CONSTRAINTS'     ,  false   );
  dbms_metadata.set_transform_param   (e, 'CONSTRAINTS_AS_ALTER',  true    );
  dbms_metadata.set_transform_param   (e, 'CONSTRAINTS'         ,  true    );
  dbms_metadata.set_transform_param   (e, 'FORCE'               ,  true    );


  m   :=  dbms_metadata.open('SCHEMA_EXPORT');
  t   :=  dbms_metadata.add_transform (m, 'DDL'                     );

  dbms_metadata.set_transform_param   (t, 'PRETTY'              ,  true    );
  dbms_metadata.set_transform_param   (t, 'SQLTERMINATOR'       ,  true    );

  dbms_metadata.set_filter            (m, 'SCHEMA'              , 'XYZ');
  dbms_metadata.set_filter            (m, 'EXCLUDE_PATH_EXPR'   , 'in ('   ||
                                            '''GRANT''          ,' || 
                                            '''SYNONYM''        ,' || 
                                            '''STATISTICS''     ,' || 
                                            '''COMMENT''         ' ||
                                            ')');


  loop
    c   :=  dbms_metadata.fetch_clob(m);
    exit when c is null;
    insert into copy_dml_schema values (c, i);
    i := i+1;
  end loop;

  dbms_metadata.close(m);

end;
/

commit;


set pages     0
set trimspool on
set long      1000000
set lines         300
set longchunksize 300


spool c:\temp\the_schema.sql

select 
  c 
from 
  copy_dml_schema 
order 
  by i; 

spool off

drop table copy_dml_schema;

set termout on

Ich hatte den Eindruck, dass diese Methode die Anweisungen "CREATE TABLE" in der Reihenfolge zurückgibt, in der sie erstellt werden können, dh abhängige Tabellen werden später ausgegeben.

Es stellt sich jedoch heraus, dass die Reihenfolge der Tabellen beliebig ist, da einige Tabellen mit einer Fremdschlüsseleinschränkung ausgegeben werden, die auf eine nicht ausgegebene Tabelle verweist.

Um dieses Problem zu "lösen", setze ich dasREF_CONSTRAINT undCONSTRAINTS_AS_ALTER auf false bzw. true, da ich davon ausging, dass mein Problem dadurch behoben würde. Welches ist nicht der Fall.

Also, gibt es eine Lösung für mein Problem, oder gibt es eine Einstellung, die ich übersehen habe?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage