获取schema所有表
用以下语句可以从oracle中获得schema中所有的表名
SELECT table_name FROM user_tables
然后可以遍历所有表向mysql进行表结构的创建与数据的迁移工作。
获取单个表的所有字段与类型
用以下语句可以从oracle中获得单个表的所有字段与类型
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = UPPER('{$table_name}') ORDER BY column_id ASC
这样可以得知表字段的名称,类型,长度,是否允许为空,默认值。因为oracle与mysql的字段类型并不完全兼容,故需要建立字段类型的对应关系表。
Oracle | Mysql |
number(<11) | int |
number(>11) | bigint |
varchar | varchar |
varchar2(<255) | varchar |
varchar2(>255) | text |
clob | text |
date | date |
获取单个表的Primary Foreign Unique Key
用以下语句可以从oracle中获得单个表的Primary Foreign Unique Key
SELECT C.CONSTRAINT_NAME, C.CONSTRAINT_TYPE, C.R_CONSTRAINT_NAME, C.DELETE_RULE,
CC.COLUMN_NAME
FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS CC
WHERE C.TABLE_NAME=upper('{$table_name}') AND C.CONSTRAINT_TYPE!='C'
AND C.CONSTRAINT_NAME=CC.CONSTRAINT_NAME AND C.OWNER=CC.OWNER AND C.TABLE_NAME=CC.TABLE_NAME
ORDER BY C.CONSTRAINT_TYPE, C.CONSTRAINT_NAME, CC.POSITION
CONSTRAINT_TYPE 为 'P'则取得表的所有Primary Key ;为 'U'则取得表的所有Unique Key ;为 'R'则取得表的所有Foreign Key ;
获取单个表的索引
用以下语句可以从oracle中获得单个表的索引
SELECT T.INDEX_NAME,T.COLUMN_NAME,I.INDEX_TYPE
FROM USER_IND_COLUMNS T,USER_INDEXES I
WHERE T.INDEX_NAME = I.INDEX_NAME AND T.TABLE_NAME = I.TABLE_NAME AND T.TABLE_NAME = UPPER('{$table_name}')
这样可以获知表的索引名称,被索引的字段。
将所有的表信息组装成mysql的表结构
有了表名,字段信息,主键,Foreign, Unique.索引等信息,就可以将表结构建立起来。由于oracle没有自增字段,一个变通的方法是用primary key做为mysql中的自增字段,因为在oracle中没办法准确地知道哪个字段用到了seq来做自增,用这种方法也不是很准确。