我们希望使用H2内存数据库来自动测试我们的Web应用程序。 我们将Oracle 10用于我们的生产和开发环境。
所以我的想法是在H2测试数据库中复制表结构,就像在我们的Oracle开发数据库中一样。
有一种简单的方法可以从Oracle 10模式(表和约束)中提取DDL,以便它们可以针对H2数据库执行吗?
答案 0 :(得分:2)
如果您的测试环境使用的是与实际实现不同的数据库引擎,那么我必须问您在证明什么。例如,H2的DATE数据类型只是DATE。在Oracle中,DATE数据类型也存储时间。
如果您决定采用这种方式,那么不要尝试将Oracle DDL语法转换为H2,而是最好在建模工具中设计数据结构并将其用作“事实来源”。该工具应该能够以Oracle和H2格式导出/创建DDL。大多数工具应该支持Oracle,尽管H2可能有点棘手。
答案 1 :(得分:2)
这个脚本帮助了我:
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);
答案 2 :(得分:1)
您应该能够使用DBMS_METADATA包为架构中的所有对象生成DDL。几天前在How to Programmatically Generate DDL from an Oracle Database进行了一次讨论,这似乎是关键。