3

我们想使用 H2 内存数据库对我们的 Web 应用程序进行自动化测试。我们将 Oracle 10 用于我们的生产和开发环境。

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

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

4

3 回答 3

2

如果您的测试环境使用与实际实现不同的数据库引擎,我将不得不问您在“证明”什么。例如,H2 有一个 DATE 数据类型,它只是一个 DATE。在 Oracle 中,DATE 数据类型也存储时间。

如果您决定走这条路,那么与其尝试将 Oracle DDL 语法转换为 H2,不如在建模工具中设计数据结构并将其用作“事实来源”。该工具应该能够以 Oracle 和 H2 格式导出/创建 DDL。大多数工具应该支持 Oracle,尽管 H2 可能有点棘手。

于 2010-11-15T22:29:18.977 回答
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);
于 2010-11-29T14:45:06.460 回答
1

您应该能够使用 DBMS_METADATA 包为架构中的所有对象生成 DDL。几天前有一个关于如何以编程方式从 Oracle 数据库生成 DDL的讨论,这似乎很重要。

于 2010-11-15T14:35:37.057 回答