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?