【问题标题】:How to export a ddl script from an Oracle 10 schema to create tables and constraints in H2-database?如何从 Oracle 10 模式中导出 ddl 脚本以在 H2 数据库中创建表和约束?
【发布时间】:2011-05-10 05:53:31
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这个脚本帮助了我:

    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】:

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

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

      【讨论】:

      • 我们选择 H2,因为它可以运行非常快的内存数据库。 Oracle 无法在内存中运行
      • 如果您的测试环境使用不同的数据库,您在“证明”什么:应用程序中的大多数错误与使用的数据库无关。
      【解决方案3】:

      您应该能够使用 DBMS_METADATA 包为架构中的所有对象生成 DDL。几天前在How to Programmatically Generate DDL from an Oracle Database 上进行了一次讨论,这似乎是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        相关资源
        最近更新 更多