我们想使用 H2 内存数据库对我们的 Web 应用程序进行自动化测试。我们将 Oracle 10 用于我们的生产和开发环境。
所以这个想法是复制 H2 测试数据库中的表结构,就像它在我们的 Oracle 开发数据库中一样。
是否有一种简单的方法可以从 Oracle 10 模式(表和约束)中提取 DDL,以便它们可以针对 H2 数据库执行?
我们想使用 H2 内存数据库对我们的 Web 应用程序进行自动化测试。我们将 Oracle 10 用于我们的生产和开发环境。
所以这个想法是复制 H2 测试数据库中的表结构,就像它在我们的 Oracle 开发数据库中一样。
是否有一种简单的方法可以从 Oracle 10 模式(表和约束)中提取 DDL,以便它们可以针对 H2 数据库执行?
如果您的测试环境使用与实际实现不同的数据库引擎,我将不得不问您在“证明”什么。例如,H2 有一个 DATE 数据类型,它只是一个 DATE。在 Oracle 中,DATE 数据类型也存储时间。
如果您决定走这条路,那么与其尝试将 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);
您应该能够使用 DBMS_METADATA 包为架构中的所有对象生成 DDL。几天前有一个关于如何以编程方式从 Oracle 数据库生成 DDL的讨论,这似乎很重要。