1. fnc_table_to_mysql 主体程序

create or replace function fnc_table_to_mysql
( i_owner in string,
i_table_name in string,
i_number_default_type in string := 'decimal',
i_auto_incretment_column_name in string := '%ID'
)
/*
功能:ORACLE表生成MYSQL建表DDL
作者:叶正盛 2013-07-27
新浪微博:@yzsind-叶正盛
参数说明:
i_owner:schema名
i_table_name:表名
i_number_default_type:NUMBER默认转换的类型,缺省是decimal
i_auto_incretment_column_name:自增属性字段名称规则,默认是%ID 已知问题:
1.不支持分区
2.不支持函数索引,位图索引等特殊索引定义
3.不支持自定义数据类型,不支持ROWID,RAW等特殊数据类型
4.不支持外键
5.不支持自定义约束
6.不支持与空间、事务相关属性
7.DATE与TIMESTAMP转换成datetime,需注意精度
8.超大NUMBER直接转换为bigint,需注意精度
9.auto incretment 是根据字段名规则加一些判断,设置不一定准确,需检查
*/
return clob is
Result clob;
cnt number;
data_type varchar2(128);
column_str varchar2(4000);
pk_str varchar2(4000);
table_comments varchar2(4000);
is_pk_column number := 0;
begin
select count(*)
into cnt
from all_tables
where owner = i_owner
and table_name = i_table_name;
if (cnt = 0) then
RAISE_APPLICATION_ERROR(-20000,'can''t found table,please check input!');
else
Result := 'CREATE TABLE `' || lower(i_table_name) || '`(';
--column
for c in (select a.column_name,
a.data_type,
a.data_length,
a.data_precision,
a.data_scale,
a.nullable,
a.data_default,
b.COMMENTS
from all_tab_cols a, all_col_comments b
where a.owner = i_owner
and a.table_name = i_table_name
and a.HIDDEN_COLUMN = 'NO'
and a.owner = b.OWNER
and a.TABLE_NAME = b.TABLE_NAME
and a.COLUMN_NAME = b.COLUMN_NAME
order by a.column_id) loop
if (c.data_type = 'VARCHAR2' or c.data_type = 'NVARCHAR2') then
data_type := 'varchar(' || c.data_length || ')';
elsif (c.data_type = 'CHAR' or c.data_type = 'NCHAR') then
data_type := 'char(' || c.data_length || ')';
elsif (c.data_type = 'NUMBER') then
if (c.column_name like '%ID' and c.data_scale is null) then
data_type := 'bigint';
elsif (c.data_precision<3 and c.data_scale = 0) then
data_type := 'tinyint';
elsif (c.data_precision<5 and c.data_scale = 0) then
data_type := 'smallint';
elsif (c.data_precision<10 and c.data_scale = 0) then
data_type := 'int';
elsif (c.data_precision is not null and c.data_scale = 0) then
data_type := 'bigint';
elsif (c.data_precision is not null and c.data_scale is not null) then
data_type := 'decimal(' || c.data_precision || ',' ||
c.data_scale || ')';
else
data_type := i_number_default_type;
end if;
elsif (c.data_type = 'DATE' or c.data_type like 'TIMESTAMP%') then
data_type := 'datetime';
elsif (c.data_type = 'CLOB' or c.data_type = 'NCLOB' or
c.data_type = 'LONG') then
data_type := 'text';
elsif (c.data_type = 'BLOB' or c.data_type = 'LONG RAW') then
data_type := 'blob';
elsif (c.data_type = 'BINARY_FLOAT') then
data_type := 'float';
elsif (c.data_type = 'BINARY_DOUBLE') then
data_type := 'double';
else
data_type := c.data_type;
end if;
column_str := ' `' || lower(c.column_name) || '` ' || data_type;
if (c.column_name like i_auto_incretment_column_name and
(c.data_scale is null or c.data_scale = 0)) then
select count(*)
into is_pk_column
from all_constraints a, all_cons_columns b
where a.owner = i_owner
and a.table_name = i_table_name
and a.constraint_type = 'P'
and a.OWNER = b.OWNER
and a.TABLE_NAME = b.TABLE_NAME
and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
and b.COLUMN_NAME = c.column_name;
if is_pk_column > 0 then
column_str := column_str || ' AUTO_INCREMENT';
end if;
end if;
if c.nullable = 'NO' then
column_str := column_str || ' NOT NULL';
end if;
if (trim(c.data_default) is not null) then
column_str := column_str || ' DEFAULT ' ||
trim(replace(replace(c.data_default, chr(13), ''),
chr(10),
''));
end if;
if c.comments is not null then
column_str := column_str || ' COMMENT ''' || c.comments || '''';
end if;
Result := Result || chr(10) || column_str || ',';
end loop;
--pk
for c in (select a.constraint_name, wm_concat(a.column_name) pk_columns
from (select a.CONSTRAINT_NAME,
'`' || b.COLUMN_NAME || '`' column_name
from all_constraints a, all_cons_columns b
where a.owner = i_owner
and a.table_name = i_table_name
and a.constraint_type = 'P'
and a.OWNER = b.OWNER
and a.TABLE_NAME = b.TABLE_NAME
and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
order by b.POSITION) a
group by a.constraint_name) loop
Result := Result || chr(10) || ' PRIMARY KEY (' ||
lower(c.pk_columns) || '),';
end loop;
--unique
for c in (select a.constraint_name, wm_concat(a.column_name) uk_columns
from (select a.CONSTRAINT_NAME,
'`' || b.COLUMN_NAME || '`' column_name
from all_constraints a, all_cons_columns b
where a.owner = i_owner
and a.table_name = i_table_name
and a.constraint_type = 'U'
and a.OWNER = b.OWNER
and a.TABLE_NAME = b.TABLE_NAME
and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
order by b.POSITION) a
group by a.constraint_name) loop
Result := Result || chr(10) || ' UNIQUE KEY `' ||
lower(c.constraint_name) || '`(' || lower(c.uk_columns) || '),';
end loop;
-- index
for c in (select a.index_name, wm_concat(a.column_name) ind_columns
from (select a.index_name,
'`' || a.COLUMN_NAME || '`' column_name
from all_ind_columns a
where a.table_owner = i_owner
and a.TABLE_NAME = i_table_name
and not exists
(select index_name
from all_constraints b
where a.TABLE_OWNER = b.owner
and a.TABLE_NAME = b.TABLE_NAME
and a.INDEX_NAME = b.INDEX_NAME)
order by a.COLUMN_POSITION) a
group by a.index_name) loop
Result := Result || chr(10) || ' KEY `' || lower(c.index_name) || '`(' ||
lower(c.ind_columns) || '),';
end loop;
Result := substr(Result, 1, length(result) - 1) || chr(10) || ')';
--table comments
select max(a.COMMENTS)
into table_comments
from all_tab_comments a
where owner = i_owner
and table_name = i_table_name;
if (table_comments is not null) then
Result := Result || 'COMMENT=''' || table_comments || '''';
end if;
Result := Result || ';';
end if;
return(Result);
end fnc_table_to_mysql;
/

2 需要转换的oracle 表

CREATE TABLE  "TEST_MYSQL"."UC_CUST_SY_CPZX"
( "BUSI_DATE" NUMBER(*,0),
"TRADE_DATE" NUMBER(*,0),
"YEAR_ID" NUMBER(*,0),
"MONTH_ID" NUMBER(*,0),
"DAY_ID" NUMBER(*,0),
"CPLX" CHAR(2 BYTE),
"CPDM" VARCHAR2(100 BYTE),
"PRODUCT_NAME" VARCHAR2(300 BYTE),
"DWJZ" NUMBER(19,4) NOT NULL ENABLE,
"LJJZ" NUMBER(19,4) NOT NULL ENABLE,
"RZZL" NUMBER(19,4) NOT NULL ENABLE,
"FQJZ" NUMBER(19,4) NOT NULL ENABLE,
"LJJZSYL" NUMBER(19,4) NOT NULL ENABLE,
"CPGLMS" NUMBER(*,0)
);

3 转换

SQL> select dbms_lob.substr(fnc_table_to_mysql('TEST_MYSQL','UC_CUST_SY_CPZX','decimal','ID')) FROM DUAL;
CREATE TABLE `uc_cust_sy_cpzx`(
`busi_date` decimal,
`trade_date` decimal,
`year_id` decimal,
`month_id` decimal,
`day_id` decimal,
`cplx` char(2),
`cpdm` varchar(100),
`product_name` varchar(300),
`dwjz` decimal(19,4),
`ljjz` decimal(19,4),
`rzzl` decimal(19,4),
`fqjz` decimal(19,4),
`ljjzsyl` decimal(19,4),
`cpglms` decimal
);

Oracle表结构转Mysql表结构的更多相关文章

  1. mysql 表关系 与 修改表结构

    目录 mysql 表关系 与 修改表结构 两张表关系 分析步骤 修改表结构 mysql 表关系 与 修改表结构 两张表关系 多对一 以员工和部门举例 多个员工对应一个部门 foreign key 永远 ...

  2. MySQL 表子查询

    MySQL 表子查询 表子查询是指子查询返回的结果集是 N 行 N 列的一个表数据. MySQL 表子查询实例 下面是用于例子的两张原始数据表: article 表: aid title conten ...

  3. mysql驱动表与被驱动表及join优化

    驱动表与被驱动表 先了解在join连接时哪个表是驱动表,哪个表是被驱动表:1.当使用left join时,左表是驱动表,右表是被驱动表2.当使用right join时,右表时驱动表,左表是驱动表3.当 ...

  4. MySQL表结构,表空间,段,区,页,MVCC

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

  5. MySQL表结构,表空间,段,区,页,MVCC ,undo 事务槽

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

  6. mysql在线修改表结构大数据表的风险与解决办法归纳

    整理这篇文章的缘由: 互联网应用会频繁加功能,修改需求.那么表结构也会经常修改,加字段,加索引.在线直接在生产环境的表中修改表结构,对用户使用网站是有影响. 以前我一直为这个问题头痛.当然那个时候不需 ...

  7. Oracle数据库体系结构及创建表结构

    Oracle服务器主要由实例.数据库.程序全局区和前台进程组成,其中实例就是用来提供管理数据库的功能:数据库由数据库文件组成,用来存储系统数据:实例可以进一步划分为系统全局区(SGA)和后台进程(PM ...

  8. 查看mysql表结构和表创建语句的方法(转)

    查看mysql表结构的方法有三种:1.desc tablename;例如:要查看jos_modules表结构的命令:desc jos_modules;查看结果:mysql> desc jos_m ...

  9. mysql 导出表结构和表数据 mysqldump用法

    mysql 导出表结构和表数据 mysqldump用法 命令行下具体用法如下:   mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据mysq ...

随机推荐

  1. 【pluginShare】依赖JQuery的弹出层封装

    目前正在做的项目,老大说打算一点点做成bootstrap那样,然后开源... 所以,趁现在不忙,先封装一些小插件,然后慢慢完善,扩大,开源... 因此博客也多了一个新的模块------分享 第一弹:a ...

  2. Codeforces 815C. Karen and Supermarket【树形DP】

    LINK 思路 首先发现依赖关系是一个树形的结构 然后因为直接算花多少钱来统计贡献不是很好 因为数组开不下 那就可以算一个子树里面选多少个的最小代价就可以了 注意统计贡献的时候用优惠券的答案只能在1号 ...

  3. 实现一个 WPF 版本的 ConnectedAnimation

    Windows 10 的创造者更新为开发者们带来了 Connected Animation 连接动画,这也是 Fluent Design System 的一部分.它的视觉引导性很强,用户能够在它的帮助 ...

  4. Oracle中用exp/imp命令快速导入导出数据

    from: http://blog.csdn.net/wangchunyu11155/article/details/53635602 [用 exp 数 据 导 出]: 1 将数据库TEST完全导出, ...

  5. hadoop2.2使用手册2:如何运行自带wordcount

    问题导读:1.hadoop2.x自带wordcount在什么位置?2.运行wordcount程序,需要做哪些准备? 此篇是在hadoop2完全分布式最新高可靠安装文档 hadoop2.X使用手册1:通 ...

  6. MTK-shot mode

    enum EShotMode{    eShotMode_NormalShot,                           /*!< Normal Shot */    eShotMo ...

  7. jdk、jre、JVM的简单区别与联系

    2015-10-20 23:08:52 (1)jdk Java development toolkit(开发工具包),JDK是整个JAVA的核心,包括了Java运行环境jre(Java Runtime ...

  8. Junit+ant+JaCoCo集成使用

    接上文,本文主要介绍Junit+ant+JaCoCo集成使用 1.工具的下载上传 需要的工具有: apache-ant-1.10.5-bin.tarapache-tomcat-8.0.50.tarja ...

  9. requirejs 到底有什么好处?

    无论是在backbone时代,还是angularjs 时代 我都用过requirejs, 后来慢慢全都去掉了, 因为在前端开发requirejs 感觉没有带来任何实质性的好处. 从几个方面说说我的感受 ...

  10. SharePoint2013切换帐户登录菜单显示

    SharePoint2013帐户姓名显示的地方没有切换帐户的菜单,这个功能对于终端用户是可有可无的,但对于sharepoint管理员或sharepoint开发人员来讲,却是一个很重要的菜单,由于经常要 ...