3

Web アプリケーションの自動テストに H2 インメモリ データベースを使用したいと考えています。本番環境と開発環境には Oracle 10 を使用しています。

したがって、H2 test-database のテーブル構造を、Oracle dev-database と同じように複製するという考えです。

H2 データベースに対して実行できるように、Oracle 10 スキーマ (テーブルと制約) から DDL を抽出する簡単な方法はありますか?

4

3 に答える 3

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 に答える
2

テスト環境が実際の実装とは異なるデータベースエンジンを使用している場合、何を「証明」しているのかを尋ねる必要があります。たとえば、H2 には単なる DATE である DATE データ型があります。Oracle では、DATE データ型にも時刻が格納されます。

このルートに進むことにした場合は、Oracle DDL 構文を H2 に変換しようとするよりも、モデリング ツールでデータ構造を設計し、それを「信頼できる情報源」として使用する方がよいでしょう。このツールは、Oracle と H2 の両方の形式で DDL をエクスポート/作成できる必要があります。ほとんどのツールは Oracle をサポートするはずですが、H2 は少し扱いに​​くいかもしれません。

于 2010-11-15T22:29:18.977 に答える
1

DBMS_METADATA パッケージを使用して、スキーマ内のすべてのオブジェクトの DDL を生成できるはずです。数日前に、Oracle データベースから DDL をプログラムで生成する方法についての議論がありました。

于 2010-11-15T14:35:37.057 に答える