Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Oracle10模式导出ddl脚本以在H2数据库中创建表和约束?_Oracle_Unit Testing_Integration Testing_Ddl_H2 - Fatal编程技术网

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

如何从Oracle10模式导出ddl脚本以在H2数据库中创建表和约束?,oracle,unit-testing,integration-testing,ddl,h2,Oracle,Unit Testing,Integration Testing,Ddl,H2,我们希望使用H2内存数据库来自动测试我们的web应用程序。 我们在生产和开发环境中使用Oracle 10 因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle dev数据库中一样 有没有一种简单的方法可以从Oracle 10模式(表和约束)中提取DDL,以便对H2数据库执行这些DDL?您应该能够使用DBMS_元数据包为模式中的所有对象生成DDL。几天前,有一次讨论似乎很有道理。我不得不问,如果您的测试环境使用的是与实际实现不同的数据库引擎,您正在“证明”什么。例如,H2的日期

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

因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle dev数据库中一样


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

您应该能够使用DBMS_元数据包为模式中的所有对象生成DDL。几天前,有一次讨论似乎很有道理。

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

如果您确实决定走这条路,那么与其尝试将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);

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