2010-11-15 40 views
3

Nous aimerions utiliser la base de données H2 en mémoire pour les tests automatisés de nos applications Web. Nous utilisons Oracle 10 pour nos environnements de production et de développement. Donc, l'idée est de dupliquer la structure de la table dans la base de données de test H2 comme c'est le cas dans notre base de données Oracle.Comment exporter un script ddl à partir d'un schéma Oracle 10 pour créer des tables et des contraintes dans la base de données H2?

Existe-t-il un moyen facile d'extraire les DDL d'un schéma Oracle 10 (tables et contraintes) pour qu'ils puissent être exécutés sur une base de données H2?

Répondre

2

Ce script m'a aidé:

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

Je dois demander ce que vous «prouver» si votre environnement de test utilise un moteur de base de données différent de l'implémentation réelle. Par exemple, H2 a un type de données DATE qui est juste une DATE. Dans Oracle, le type de données DATE stocke également une heure. Si vous décidez de suivre cette route, alors plutôt que d'essayer de convertir la syntaxe Oracle DDL en H2, vous feriez mieux de concevoir les structures de données dans un outil de modélisation et de l'utiliser comme votre «source de vérité». L'outil doit pouvoir exporter/créer des DDL dans les formats Oracle et H2. La plupart des outils devraient supporter Oracle, même si H2 pourrait être un peu plus compliqué.

+0

nous chooose H2, car il peut exécuter une base de données en mémoire qui est très rapide. Oracle ne peut pas exécuter im memory –

+8

Qu'est-ce que vous «prouvez» si votre environnement de test utilise une base de données différente: la plupart des bogues de l'application ne sont pas liés à la base de données utilisée. –