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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 文件查看命令

一、cat命令 1.cat文件名&#xff0c;查看文件内容&#xff1a; 例如&#xff0c;查看main.c文件的内容&#xff1a; 2.cat < 文件名&#xff0c;往文件中写入数据&#xff0c; Ctrld是结束输入 例如&#xff0c;向文件a.txt中写入数据&#xff1a; 查看刚刚写入a.txt的…

Yolov5(一)VOC划分数据集、VOC转YOLO数据集

代码使用方法注意修改一下路径、验证集比例、类别名称&#xff0c;其他均不需要改动&#xff0c;自动划分训练集、验证集、建好全部文件夹、一键自动生成Yolo格式数据集在当前目录下&#xff0c;大家可以直接修改相应的配置文件进行训练。 目录 使用方法&#xff1a; 全部代码…

解决监督学习,深度学习报错:AttributeError: ‘xxx‘ object has no attribute ‘module‘!!!!

哈喽小伙伴们大家好呀&#xff0c;很长时间没有更新啦&#xff0c;最近在研究一个问题&#xff0c;就是AttributeError: xxx object has no attribute module 今天终于是解决了&#xff0c;所以来记录分享一下&#xff1a; 我这里出现的问题是&#xff1a; 因为我的数据比较大…

SQL优化

一、插入数据 优化 1.1 普通插入&#xff08;小数据量&#xff09; 普通插入&#xff08;小数据量&#xff09;&#xff1a; 采用批量插入&#xff08;一次插入的数据不建议超过1000条&#xff09;手动提交事务主键顺序插入 1.2 大批量数据插入 大批量插入&#xff1a;&…

Android 开发中需要了解的 Gradle 知识

作者&#xff1a;wkxjc Gradle 是一个基于 Groovy 的构建工具&#xff0c;用于构建 Android 应用程序。在 Android 开发中&#xff0c;了解 Gradle 是非常重要的&#xff0c;因为它是 Android Studio 默认的构建工具&#xff0c;可以帮助我们管理依赖项、构建应用程序、运行测试…

macOS 如何安装git和nvm

首先&#xff1a;先来安装git 打开macOS终端 将下面的命令复制粘贴进去&#xff1a; curl -O https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.41.0.tar.gz 版本号可以参考一下官网的 我这里安装的是目前最新的2.41.0 然后在终端输入下面的代码或者双击git的…

数据结构:力扣OJ题

目录 ​编辑题一&#xff1a;链表分割 思路一&#xff1a; 题二&#xff1a;相交链表 思路一&#xff1a; 题三&#xff1a;环形链表 思路一&#xff1a; 题四&#xff1a;链表的回文结构 思路一&#xff1a; 链表反转&#xff1a; 查找中间节点&#xff1a; 本人实力…

YOLOv8+ByteTrack多目标跟踪(行人车辆计数与越界识别)

课程链接&#xff1a;https://edu.csdn.net/course/detail/38901 ByteTrack是发表于2022年的ECCV国际会议的先进的多目标跟踪算法。YOLOv8代码中已集成了ByteTrack。本课程使用YOLOv8和ByteTrack对视频中的行人、车辆做多目标跟踪计数与越界识别&#xff0c;开展YOLOv8目标检测…

Leetcode每日一题:23. 合并 K 个升序链表(2023.8.12 C++)

目录 23. 合并 K 个升序链表 题目描述&#xff1a; 实现代码与解析&#xff1a; 优先级队列&#xff1a; 原理思路&#xff1a; 23. 合并 K 个升序链表 题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表…

Flutter: A RenderFlex overflowed by 42 pixels on the bottom.

Flutter&#xff1a;渲染活动底部上方溢出了42个像素 Flutter 控件超出异常&#xff1a;A RenderFlex overflowed by 42 pixels on the bottom. 解决方案 1.Scaffold内添加 resizeToAvoidBottomInset 属性&#xff0c;缺点是软键盘下面的控件被挡住 Scaffold( resizeToAvoidBot…

第一百二十七天学习记录:我的创作纪念日

机缘 今天收到CSDN官方的来信&#xff0c;想想也可以对我前面的学习记录进行一个总结。 关于来到CSDN的初心&#xff0c;也就是为了让自己养成一个良好的学习总结的习惯。这里要感谢我C语言视频教程的老师&#xff0c;是他建议学生们在技术博客中进行记录。对于技术博客&…

web-Element

在vueapp里<div><!-- <h1>{{message}}</h1> --><element-view></element-view></div> <div><!-- <h1>{{message}}</h1> --><element-view></element-view></div>在view新建个文件 <t…

C++ VTK 8.2 如何绘制弹簧图形

//创建圆柱 vtkSmartPointer<vtkCylinderSource> spCylinderSource vtkSmartPointer<vtkCylinderSource>::New(); spCylinderSource->SetHeight(m_dCylinderHeight); // 设置圆柱的高度 spCylinderSource->SetRadius(m_dCylinderRadius)…

Spring(12) BeanFactory 和 ApplicationContext 区别

目录 一、BeanFactory 和 ApplicationContext 区别&#xff1f;二、既然 Spring Boot 中使用的是 ApplicationContext 进行应用程序的启动和管理&#xff0c;那么 Spring Boot 会用到 BeanFactory 吗&#xff1f; 一、BeanFactory 和 ApplicationContext 区别&#xff1f; Bea…

git clone使用https协议报错OpenSSL SSL_read: Connection was reset, errno 10054

在使用git 下载github上的代码时&#xff0c; 一般有ssh协议和https协议两种。使用ssh协议可以成功clone代码&#xff0c; 但使用https协议时出错&#xff1a; $ git clone https://github.com/openai/improved-diffusion.git Cloning into improved-diffusion... fatal: unab…

vue或uniapp使用pdf.js预览

一、先下载稳定版的pdf.js&#xff0c;可以去官网下载 官网下载地址 或 pdf.js包下载(已配置好&#xff0c;无需修改) 二、下载好的pdf.js文件放在public下静态文件里&#xff0c; uniapp是放在 static下静态文件里 三、使用方式 1. vue项目 注意路径 :src"static/pd…

每日一题 206反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; …

块、行内块水平垂直居中

1.定位实现水平垂直居中 <div class"outer"><div class"test inner1">定位实现水平垂直居中</div></div><style>.outer {width: 300px;height: 300px;border: 1px solid gray;margin: 100px auto 0;position: relative;}.te…

途乐证券-新股行情持续火爆,哪些因素影响首日表现?

全面注册制以来&#xff0c;参加打新的投资者数量全体呈现下降。打新收益下降&#xff0c;破发频出的布景下&#xff0c;投资者打新策略从逢新必打逐步向优选个股改变。 经过很多历史数据&#xff0c;从商场定价、参加者热度以及机构重视度维度揭秘了上市后股价体现优秀的个股具…

在多页面应用和单页面应用中(例如vue)怎么提高seo搜索引擎优化

那么 我们要先知道 搜索引擎是怎么工作的&#xff1f; 搜索引擎是通过一系列步骤来工作的&#xff0c;以下是其基本原理&#xff1a; 1、网络爬虫&#xff1a;搜索引擎使用网络爬虫&#xff08;也称为蜘蛛、机器人&#xff09;来从互联网上抓取网页。网络爬虫按照预定义的规则…