Oracle自定义函数生成MySQL表结构的DDL语句

这篇具有很好参考价值的文章主要介绍了Oracle自定义函数生成MySQL表结构的DDL语句。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
  参数说明:  
  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;  
/

二. 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)
   );

三. 执行SQL语句生成MySQL数据库表DDL语句

SQL> select dbms_lob.substr(fnc_table_to_mysql('TEST_MYSQL','UC_CUST_SY_CPZX','decimal','ID')) FROM DUAL;
-- MySQL数据库表DDL语句
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
);

文章来源地址https://www.toymoban.com/news/detail-643875.html

到了这里,关于Oracle自定义函数生成MySQL表结构的DDL语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • oracle导出表结构语句(包含注释加主键)

    上述语句主要运用了listagg函数进行了重复的行合并处理,因为主键的行会重复,把position进行了合并。

    2024年02月10日
    浏览(28)
  • oracle和mysql语句有哪些异同点?

    Oracle和MySQL是两个流行的关系型数据库管理系统,它们都有SQL(结构化查询语言)作为主要的查询语言。尽管它们共享许多基本的SQL功能,但它们之间也存在一些关键的差异。以下是一些Oracle和MySQL语句的异同点: 数据类型 : 相同点 :两者都有整数、浮点数、字符、日期等

    2024年02月21日
    浏览(22)
  • Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL

     导航: 【Java笔记+踩坑汇总】Java基础+进阶+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud+黑马旅游+谷粒商城+学成在线+MySQL高级篇+设计模式+面试题汇总+源码_vincewm的博客-CSDN博客 目录 一、基本区别 1.1 基本特性 1.2 Oracle和MySQL如何做技术选型? 1.3 RDBMS和ORDBMS的区别 1.4 默认端口号和用

    2024年02月12日
    浏览(32)
  • Oracle-day3:子查询、with as语句、聚合函数

    例题:

    2024年02月11日
    浏览(30)
  • oracle 自定义函数(非常简单明了)

    1.举一个简单的例子 定义一个简单的函数,计算两数之和 函数的使用请继续往下看 2.举一个复杂的例子(虽然复杂,但是很实用) 1⃣️、定义函数的返回类型 创建 TYPE 类型 atrr_type 2、将 TYPE 类型 atrr_type 定义为表, 用做接收返回值 2⃣️、定义函数(这里介绍三种方式)

    2024年02月09日
    浏览(31)
  • 解决Oracle SQL语句性能问题——SQL语句改写(分析函数、with as、union及or)

    4. 正确使用分析函数 分析函数最早出现于Oracle 8i版本中,并在后续版本中不断得以增强。正确的使用分析函数,不但能非常方便的实现某些功能,而且,在某些场景中,还可以大幅提升SQL语句的性能。因此,为了简化应用实现逻辑或解决相关SQL语句性能问题,有时我们需要利

    2024年02月10日
    浏览(34)
  • Oracle获取创建对象的DDL脚本

    例如,对tzq schema下的表 test2,查看DDL脚本的SQL如下:

    2024年02月14日
    浏览(40)
  • 增删改undo生成量??index是否写undo?Oracle DML语句(insert,update,delete) ‘回滚开销估算‘

    --insert操作 undo记录什么 --update操作 undo记录什么 --delete操作 undo记录什么 //index是否写undo? 结论是写。可通过对比加index之前和加index之后的undo生成量进行对比得出结论。 //undo数据产生量 redo中只会记录少量信息,这些信息足以重演事务; undo中也只记录精简信息,这些信息足以撤

    2024年01月23日
    浏览(40)
  • 基于mysql5.7制作自定义的docker镜像,适用于xxl-job依赖的数据库,自动执行初始化脚本(ddl语句和dml语句)

    xxl-job-admin依赖mysql数据库,且需执行初始化脚本,包括ddl和dml语句。 具体的步骤总结如下: 1、新建数据库xxl_job 2、创建mysql表table 3、执行dml语句,包括新建admin用户及密码,创建执行器和任务。 毫无疑问,人工每次去操作这些,不仅耗费人力和时间,还容易出错。 所以,本

    2024年02月11日
    浏览(42)
  • MySQL、Oracle 生成随机ID、随机数、随机字符串

    UUID():是由128位的数字组成的全局唯一标识符。每次都生成一个新的随机数。 它通常以32个十六进制数的形式表示,分为5个部分,以连字符分隔。 UUID的长度是36个字符,包括32个十六进制数字和4个连字符。 UUID的标准格式是由 8-4-4-4-12 个十六进制数字组成的,其中每个部分的

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包