我正在尝试使用DBMS_METADATA提取给定模式的DDL,但可能是因为我的理解有误导致出现问题。
这是我基本上做的事情:
我原本认为这种方法会按照可以创建的顺序返回“CREATE TABLE”语句,即较为依赖的表会后返回。
然而,事实证明,表的顺序是任意的,因为一些表引用了未被返回的表的外键约束。
为了解决这个问题,我将
那么,有没有解决我问题的方法,或者有我忽略的设置?
这是我基本上做的事情:
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
我原本认为这种方法会按照可以创建的顺序返回“CREATE TABLE”语句,即较为依赖的表会后返回。
然而,事实证明,表的顺序是任意的,因为一些表引用了未被返回的表的外键约束。
为了解决这个问题,我将
REF_CONSTRAINT
和CONSTRAINTS_AS_ALTER
设置为false和true,因为我假设这样会让我的问题消失。但实际上并不是这样的。那么,有没有解决我问题的方法,或者有我忽略的设置?