Как экспортировать сценарий ddl из схемы Oracle 10 для создания таблиц и ограничений в базе данных H2? - PullRequest
3 голосов
/ 15 ноября 2010

Мы хотели бы использовать базу данных H2 в памяти для автоматического тестирования наших веб-приложений. Мы используем Oracle 10 для наших производственных сред и сред разработки.

Таким образом, идея состоит в том, чтобы продублировать структуру таблицы в тестовой базе данных H2, как в нашей базе данных Oracle dev.

Есть ли простой способ извлечь DDL из схемы Oracle 10 (таблицы и ограничения), чтобы их можно было выполнять в базе данных H2?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

Мне нужно спросить, что вы «доказываете», если в вашей тестовой среде используется другой движок базы данных, чем в реальной реализации. Например, H2 имеет тип данных DATE, который является просто DATE. В Oracle тип данных DATE также хранит время.

Если вы решите пойти по этому пути, то вместо того, чтобы пытаться преобразовать синтаксис Oracle DDL в H2, вам лучше будет проектировать структуры данных в инструменте моделирования и использовать его в качестве «источника правды». Инструмент должен быть способен экспортировать / создавать DDL в форматах Oracle и H2. Большинство инструментов должны поддерживать Oracle, хотя H2 может быть немного сложнее.

2 голосов
/ 29 ноября 2010

Этот скрипт мне помог:

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);
1 голос
/ 15 ноября 2010

Вы должны иметь возможность использовать пакет DBMS_METADATA для генерации DDL для всех объектов в вашей схеме. Пару дней назад была дискуссия на тему Как программно генерировать DDL из базы данных Oracle , которая, казалось бы, на подходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...