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.pswp.cn/news/34895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34895.shtml
英文地址,請注明出處:http://en.pswp.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;來從互聯網上抓取網頁。網絡爬蟲按照預定義的規則…