On Jun 18, 7:58 pm, Jaden <
mail.me.ja...@gmail.com> wrote:
> For unit testing purposes, I would like to import the oracle
> development database schema structure ONLY into an in-memory H2
> database(oracle compatible).
I've done this by examining the Oracle data dictionary views and
generating DDL programatically. (I wish I could share the code; alas,
it's confidential.)
Start by keeping the Oracle Database Reference guide handy:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/toc.htm
DBA_TAB_COLUMNS will tell you the basic structure of each table.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/statviews_2091.htm#I1020277
COLUMN_ID gives the ordering of the columns.
COLUMN_NAME, DATA_TYPE and NULLABLE ('Y' or 'N') are self-
explanatory. Be sure to rename VARCHAR2 to VARCHAR; you might also
want to translate DATE to TIMESTAMP in H2 (since Oracle DATEs can have
times associated with them).
DATA_PRECISION and DATA_SCALE are relevant for NUMBER types. (Some
columns show up with DATA_PRECISION==0; in these cases, you should
just create the H2 version as NUMBER.)
CHAR_LENGTH and CHAR_USED are relevant for CHAR/NCHAR/VARCHAR2/
NVARCHAR2 types. CHAR_USED is 'B' if CHAR_LENGTH is in bytes, 'C' if
it's in characters.
Then query DBA_CONSTRAINTS to find out what else should be applied to
the table.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/statviews_1044.htm#i1576022
I start by looking at primary keys (CONSTRAINT_TYPE='P'); join it with
DBA_CONS_COLUMNS:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/statviews_1042.htm#i1575870
SELECT cc.column_name
FROM dba_constraints c
INNER JOIN dba_cons_columns cc
ON c.constraint_name = cc.constraint_name
WHERE c.owner=?
AND c.table_name=?
AND c.constraint_type='P'
ORDER BY cc.position
Do the same for unique keys (CONSTRAINT_TYPE='U').
Foreign keys (CONSTRAINT_TYPE='R') are a pain. You first need to grab
DBA_CONS_COLUMNS for the child table. R_CONSTRAINT_NAME then points
you at a primary or unique key constraint for the parent table;
R_OWNER is the owner of the table. However, you won't know the name
of the table until you query DBA_CONS_COLUMNS for R_CONSTRAINT_NAME.
I haven't implemented check constraints yet, but you'll look in
DBA_CONSTRAINTS' SEARCH_CONDITION column for this information.
Hope this gives you a pointer in the right direction. Apologies,
again, that I can't provide actual code here.