Web アプリケーションの自動テストに H2 インメモリ データベースを使用したいと考えています。本番環境と開発環境には Oracle 10 を使用しています。
したがって、H2 test-database のテーブル構造を、Oracle dev-database と同じように複製するという考えです。
H2 データベースに対して実行できるように、Oracle 10 スキーマ (テーブルと制約) から DDL を抽出する簡単な方法はありますか?
Web アプリケーションの自動テストに H2 インメモリ データベースを使用したいと考えています。本番環境と開発環境には Oracle 10 を使用しています。
したがって、H2 test-database のテーブル構造を、Oracle dev-database と同じように複製するという考えです。
H2 データベースに対して実行できるように、Oracle 10 スキーマ (テーブルと制約) から DDL を抽出する簡単な方法はありますか?
このスクリプトは私を助けました:
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 には単なる DATE である DATE データ型があります。Oracle では、DATE データ型にも時刻が格納されます。
このルートに進むことにした場合は、Oracle DDL 構文を H2 に変換しようとするよりも、モデリング ツールでデータ構造を設計し、それを「信頼できる情報源」として使用する方がよいでしょう。このツールは、Oracle と H2 の両方の形式で DDL をエクスポート/作成できる必要があります。ほとんどのツールは Oracle をサポートするはずですが、H2 は少し扱いにくいかもしれません。
DBMS_METADATA パッケージを使用して、スキーマ内のすべてのオブジェクトの DDL を生成できるはずです。数日前に、Oracle データベースから DDL をプログラムで生成する方法についての議論がありました。