如何从Oracle 10模式导出ddl脚本以在H2数据库中创建表和约束?

时间:2010-11-15 13:25:33

标签: oracle unit-testing integration-testing ddl h2

我们希望使用H2内存数据库来自动测试我们的Web应用程序。 我们将Oracle 10用于我们的生产和开发环境。

所以我的想法是在H2测试数据库中复制表结构,就像在我们的Oracle开发数据库中一样。

有一种简单的方法可以从Oracle 10模式(表和约束)中提取DDL,以便它们可以针对H2数据库执行吗?

3 个答案:

答案 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进行了一次讨论,这似乎是关键。