如何从Oracle10模式导出ddl脚本以在H2数据库中创建表和约束?
我们希望使用H2内存数据库来自动测试我们的web应用程序。 我们在生产和开发环境中使用Oracle 10 因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle dev数据库中一样如何从Oracle10模式导出ddl脚本以在H2数据库中创建表和约束?,oracle,unit-testing,integration-testing,ddl,h2,Oracle,Unit Testing,Integration Testing,Ddl,H2,我们希望使用H2内存数据库来自动测试我们的web应用程序。 我们在生产和开发环境中使用Oracle 10 因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle dev数据库中一样 有没有一种简单的方法可以从Oracle 10模式(表和约束)中提取DDL,以便对H2数据库执行这些DDL?您应该能够使用DBMS_元数据包为模式中的所有对象生成DDL。几天前,有一次讨论似乎很有道理。我不得不问,如果您的测试环境使用的是与实际实现不同的数据库引擎,您正在“证明”什么。例如,H2的日期
有没有一种简单的方法可以从Oracle 10模式(表和约束)中提取DDL,以便对H2数据库执行这些DDL?您应该能够使用DBMS_元数据包为模式中的所有对象生成DDL。几天前,有一次讨论似乎很有道理。我不得不问,如果您的测试环境使用的是与实际实现不同的数据库引擎,您正在“证明”什么。例如,H2的日期数据类型只是一个日期。在Oracle中,日期数据类型也存储时间 如果您确实决定走这条路,那么与其尝试将Oracle DDL语法转换为H2,不如在建模工具中设计数据结构,并将其用作“真相来源”。该工具应该能够导出/创建Oracle和H2格式的DDL。大多数工具都应该支持Oracle,不过H2可能有点棘手。此脚本帮助我:
create or replace function mymetadata return sys.ku$_ddls is
md_handle number;
tr_handle number;
dl_handle number;
result_array sys.ku$_ddls;
begin
md_handle := dbms_metadata.open('TABLE');
tr_handle := dbms_metadata.add_transform(md_handle, 'MODIFY');
dbms_metadata.set_remap_param(tr_handle, 'REMAP_SCHEMA', 'MLIS_DEV', null);
dl_handle := dbms_metadata.add_transform(md_handle, 'DDL');
dbms_metadata.set_transform_param(dl_handle, 'SEGMENT_ATTRIBUTES', false);
dbms_metadata.set_transform_param(dl_handle, 'STORAGE', false);
dbms_metadata.set_transform_param(dl_handle, 'TABLESPACE', false);
dbms_metadata.set_transform_param(dl_handle, 'REF_CONSTRAINTS', false);
dbms_metadata.set_transform_param(dl_handle, 'SQLTERMINATOR', true);
dbms_metadata.set_transform_param(dl_handle, 'CONSTRAINTS_AS_ALTER', true);
LOOP
result_array := dbms_metadata.fetch_ddl(md_handle);
EXIT WHEN result_array IS NULL;
FOR i IN result_array.FIRST..result_array.LAST LOOP
dbms_output.put_line(result_array(i).ddltext);
END LOOP;
END LOOP;
dbms_metadata.close(md_handle);
md_handle := dbms_metadata.open('REF_CONSTRAINT');
tr_handle := dbms_metadata.add_transform(md_handle, 'MODIFY');
dbms_metadata.set_remap_param(tr_handle, 'REMAP_SCHEMA', 'MLIS_DEV', null);
dl_handle := dbms_metadata.add_transform(md_handle, 'DDL');
dbms_metadata.set_transform_param(dl_handle, 'SQLTERMINATOR', true);
LOOP
result_array := dbms_metadata.fetch_ddl(md_handle);
EXIT WHEN result_array IS NULL;
FOR i IN result_array.FIRST..result_array.LAST LOOP
dbms_output.put_line(result_array(i).ddltext);
END LOOP;
END LOOP;
dbms_metadata.close(md_handle);
return result_array;
end;
/
select ddltext from table(mymetadata);
我们选择H2,因为它可以运行非常快的内存数据库。Oracle无法运行im Memory如果您的测试环境使用的是不同的数据库,您在“证明”什么:应用程序中的大多数错误与使用的数据库无关。