oracle 遷移至 mysql 部分語句的轉換
前幾天吧系統從oracle往mysql上遷移,很多的語句是比較簡單的,就是一些函式的修改如to-date等
但是也有幾個比較棘手的,這裡記錄下
第一、row_number() over(partition by
首先要了解下oracle中這個函式的用法,看個例子
select t.*,row_number() over(partition by t.owner order by y.createDate desc) rn from test t
這個語句的意思就是,把test這個表的資料按照owner 分組並且給每個分組的裡面的資料加上一個序列號,資料格式如下
id name owner createDate rn
1 aa 001 1
2 bb 001 2
3 cc 001 3
4 dd 002 1
5 ee 002 2
6 ff 003 1
資料搞得不太正規,但是應該能夠看懂它的意思吧,
但是在mysql中是沒有這個函式的於是乎,找啊找,總算找了個解決方法,如下
SELECT
heyf_tmp.*,
IF(@pdept=heyf_tmp.owner ,@rn:[email protected]+1,@rn:=1) AS rn,
@pdept:=heyf_tmp.owner
FROM
(
SELECT
yv.*
FROM
test yv
ORDER BY
yv.owner ,
yv.createDate DESC
)
heyf_tmp ,
(
SELECT
@rn :=0 ,
@pdept := NULL ,
@rn:=0
)
aa
具體是什麼意思,不是很清楚,不過先解決問題再說
第二、oracle樹形查詢
oracle樹形查詢現成的方法
select distinct t.id as id, t.name
from test t
start with id=‘’
connect by prior id = parentid
但是mysql中是沒有這個方法的,於是只能自己定義函式或者過程,我這裡用的是過程
如下
CREATE PROCEDURE Pro_GetTreeList`(in pid varchar(36))
begin
declare lev int;
set lev=1;
drop table if exists tmp1;
CREATE TABLE tmp1(id VARCHAR(40),name varchar(50),parentid varchar(40) ,levv INT);
INSERT tmp1 SELECT id,name,parent_id,1 FROM `test` WHERE parent_id=pid;
while row_count()>0
do set lev=lev+1;
INSERT tmp1 SELECT t.id,t.name,t.parent_id,lev from testt join tmp1 a on t.parent_id=a.id AND levv=lev-1;--查出子節點
end while ;
INSERT tmp1 SELECT id,name,parent_id,0 FROM test WHERE id=pid; --查出當前節點
end
這個儲存過程應該都能看懂吧,就不做多解釋了
第三 、函式中定義類似一維、二維陣列,
oracle中可以直接定義的,如
return number is newList := NewList((1,2,3),(4,5,6));這樣可以直接返回 return newList(1,2) 返回的就是2了,
但是mysql中卻不能這樣寫的,不過也有這樣的方法解決:
對於一維的來說,很簡單,有函式的elt函式,可以直接return elt(index,'1','2','3'); 如果elt(3,'1','2','3') 這樣返回的就是 3了,
不過對於二維的來說好像沒有現成的函式用了,我的解決方法是改成個表來做,把資料錄入到表中,然後去查表,這丫要給你也是可以實現
第四、 mysql中獲取漢字的首個大寫字母
mysql中遇到了這樣的一個問題,網上找到了方法,轉載地址://http://blog.csdn.net/lky5387/article/details/11973721
DROP FUNCTION IF EXISTS `getPY`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `getPY`(in_string VARCHAR(65534)) RETURNS mediumtext CHARSET utf8
BEGIN
DECLARE tmp_str VARCHAR(65534) charset gbk DEFAULT '' ; #擷取字串,每次做擷取後的字串存放在該變數中,初始為函式引數in_string值
DECLARE tmp_len SMALLINT DEFAULT 0;#tmp_str的長度
DECLARE tmp_char VARCHAR(2) charset gbk DEFAULT '';#擷取字元,每次 left(tmp_str,1) 返回值存放在該變數中
DECLARE tmp_rs VARCHAR(65534) charset gbk DEFAULT '';#結果字串
DECLARE tmp_cc VARCHAR(2) charset gbk DEFAULT '';#拼音字元,存放單個漢字對應的拼音首字元
SET tmp_str = in_string;#初始化,將in_string賦給tmp_str
SET tmp_len = LENGTH(tmp_str);#初始化長度
WHILE tmp_len > 0 DO #如果被計算的tmp_str長度大於0則進入該while
SET tmp_char = LEFT(tmp_str,1);#獲取tmp_str最左端的首個字元,注意這裡是獲取首個字元,該字元可能是漢字,也可能不是。
SET tmp_cc = tmp_char;#左端首個字元賦值給拼音字元
IF LENGTH(tmp_char)>1 THEN#判斷左端首個字元是多位元組還是單位元組字元,要是多位元組則認為是漢字且作以下拼音獲取,要是單位元組則不處理。
SELECT ELT(INTERVAL(CONV(HEX(tmp_char),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC
,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA ,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z') INTO tmp_cc; #獲得漢字拼音首字元
END IF;
SET tmp_rs = CONCAT(tmp_rs,tmp_cc);#將當前tmp_str左端首個字元拼音首字元與返回字串拼接
SET tmp_str = SUBSTRING(tmp_str,2);#將tmp_str左端首字元去除
SET tmp_len = LENGTH(tmp_str);#計算當前字串長度
END WHILE;
RETURN tmp_rs;#返回結果字串
END;;
DELIMITER ;
第四、 圖片clob的修改
系統中的功能是把圖片存在blob欄位中的,,原來用的是oracle,java中對應的欄位是Object,但是mysql中如果這樣做卻不能獨處圖片,原因可能是因為在往Object中寫資料時出錯了,這個號解決,只要把java中對應欄位的型別改成byte[] 就行了
第五、mysql中 group_concat 與 find_in_set 用法
在專案中遇到這樣的需求,
表event中如下欄位 表work中如下欄位
id ename id wname eventid
1001 事件1 1 工作1 1001
1002 事件2 2 工作2 1001,1002
1003 事件3 3 工作3 1001,1003
現查詢了一張work表資料,需要展示id name event名稱,只用一個sql展示,
select wname, (select group_concat(ename) from event where find_in_set(id,eventid) ) as ename from work;
這一個sql就可以搞定,find_in_set 用法以逗號分隔開與id進行匹配,返回多條記錄, group_concat為把展示的多行記錄做成一列展示並以逗號拼接
相關推薦
oracle 遷移至 mysql 部分語句的轉換
前幾天吧系統從oracle往mysql上遷移,很多的語句是比較簡單的,就是一些函式的修改如to-date等 但是也有幾個比較棘手的,這裡記錄下 第一、row_number() over(partition by 首先要了解下oracle中這個函式的用法,看個例子 s
oracle資料庫遷移至mysql 之 sysdate格式化及運算替換
例1,查詢當前系統日期 select to_char(sysdate,'yyyy-mm-dd') from dual 替換為 select current_date; 或者 select curdate(); 例2,查詢當前系統時間 select to_c
Oracle遷移到MySQL性能下降的註意點(轉)
class acl 技術 table 劃分 hash join 重要 發生 rst 背景:最近有較多的客戶系統由原來由Oracle改造到MySQL後出現了性能問題CPU 100%,或是後臺的CRM系統復雜SQL在業務高峰的時候出現堆積導致業務故障。在我的記憶裏面淘寶最初從O
oracle遷移到mysql方案之——ogg(goldengate)
icp ger AR 問題 IT flush get gop extract source源端 oracle 11.2.0.4 ogg12cip:10.200.3.193 系統centos 7.1 1. 創建source表和一些初始化數據su - oraclesqlplu
oracle遷移到mysql分庫分表方案之——ogg(goldengate)
apply columns version alt ML -c testing name sam 之前文章主要介紹了oracle 遷移到mysql,主要是原表原結構遷移,但是實際運維中會發現,到mysql以後需要分庫和分表的拆分操作,這個時候,用ogg來做,也是很強大好用的
從Oracle遷移到MySQL的各種坑及自救方案
ppi 行數據 服務器 內部 fin htm 分離 data 意思 當企業內部使用的數據庫種類繁雜時,或者有需求更換數據庫種類時,都可能會做很多數據遷移的工作。有些遷移很簡單,有些遷移可能就會很復雜,大家有沒有考慮過為了順利完成復雜的數據庫遷移任務,都需要考慮並解決哪些
ORACLE遷移到MYSQL總結
這兩個星期裡一直都在忙於一件事兒,就是資料庫的遷移問題。沒有做的時候感覺這是一件十分輕鬆的事兒,可是等到實實在在去做去實現的時候,自己傻眼了。這種糾結啊, 在這裡先說下遇到的問題: 1。資料庫的表結構問題:資料型別不同需要解決varchar2------varchar、nu
將Windows上的Oracle遷移至Linux
space acl log dmp manage 創建 選擇 spa file 遷移前提: 1.在安裝Linux數據庫實例時,註意選擇的編碼格式要與Windows的數據庫實例一致。 遷移步驟 1.檢查Linux上數據庫實例的編譯格式 SQL> select usere
asp.net mvc entityframework sql server 遷移至 mysql方法以及遇到的問題
背景: 我原來的專案是asp.net mvc5 + entityframework 6.4 for sql server(localdb,sql server),現在需要把資料庫切換成mysql,理論上entityframework是可以完全做到無縫切換,畢竟ORM的設計就是為了相容不同的底層資料庫。 步
如何手動將ORACLE的sql建表語句轉換為MYSQL的建表語句
ORACLE sql建表語句 CREATE TABLE "SCOTT"."BUG" ( "BUG_ID" NUMBER NOT NULL , "BUG_TYPE" VARCHAR2(200 BY
SQL語句優化系列四(Oracle數據庫日期格式轉換)
fun ont 如果 etime 當前時間 字符轉換函數 dual minute nbsp Oracle數據庫日期格式轉換 select sysdate from dual select to_char(sysdate,‘yyyy/mm/dd hh24:mi:ss‘) as
本想把docker中運行的mysql遷移至RDS中,確沒想到mysql會話“炸鍋了”
數據庫遷移 mysql rds 1事件起源 ?整個事件的起源還要從筆者最近入職了一家區塊鏈金融公司來說起(為了保密性,不便透露公司名字),公司業務發展比較迅猛,突破百萬用戶也是近在眼前。整個系統都在阿裏雲上運行,每天都能看到用戶的不斷增長,即興奮又擔憂,為什麽這麽說呢? ?由於筆者過來的時候這裏業
Oracle和MySQL刪除語句的一個區別
-c fff mysq delete 刪除 ron ffffff spa 刪除語句 Oracle: DELETE * FROM 表; OK DELETE FROM 表; OK DELETE 表1,表2 FROM 表1,表2; WRONG MySQL: D
將oracle中的資料遷移到mysql中,避免亂碼的方法
1.將oracle中的資料匯出成csv格式的檔案 將oracle中的查詢結果集,點選匯出,選擇csv。(匯出Excel格式非常非常慢,Excel匯入mysql中時,選擇65001 (UTF-8),中文不會亂碼) 2.用mysql資料庫管理工具navicat,點選到表選項(非具體表),點選
【oracle】oracle使用utl_file和sqlloard實現A表資料遷移至B表資料(欄位數和順序不一樣)
oracle使用utl_file和sqlloard實現A表資料遷移至B表資料(欄位數和順序不一樣) 資料庫版本:11.2.0.4;系統版本:CentOS Linux 6.8 使用utl_file方式從A表匯出部分欄位至文字,再使用sqlload方式載入進B表; 表test欄位: 
ORACLE中查詢語句的執行順及where部分條件執行順序測試 Oracle中的一些查詢語句及其執行順序 Select 語句執行順序以及如何提高Oracle 基本查詢效率
Oracle中的一些查詢語句及其執行順序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查詢條件:1)LIKE:模糊查詢,需要藉助兩個萬用字元,%:表示0到多個字元;_:標識單個字元。2)IN(list):用來取出符合列表範圍中的資料。3)NOT I
Oracle和Mysql關於型別轉換時的衝突問題
Oracle和Mysql關於型別轉換時的衝突問題 Mysql對大小寫不敏感,而Oracle則必須大寫 當型別轉換時,例如,mysql中某個欄位型別為Integer,在使用過程中,從map中獲取到時,需要從Object轉為Integer,是沒有問題的;而同樣的程式碼在Oracle中則不行,Oracl
java.util.Date日期類通過java語句轉換成Sql(這裡測試用的是oracle)語句可直接插入(如:insert into)的日期型別
public void add(Emp emp) throws Exception{ QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource()); String sql = "insert
資料遷移問題MySQL——>Oracle
共遷移7張表,表間互有關聯,操作步驟: 1、使用Navicat將資料從Mysql傳輸到Oracle Navicat—>工具—>資料傳輸,注意高階選項中的設定。 2、發現問題遷移後的表名和欄位名有"",在Oracle中,加""的表名是大小寫敏感的,需將加"
ORACLE遷移中的一些經驗(三)批量匯出index 建索引、使用者、許可權等語句
1、批量匯出INDEXES語句 SELECT DBMS_METADATA.GET_DDL(u.OBJECT_TYPE, u.object_name,u.OWNER) FROM DBA_OBJECTS u where u.OBJECT_TYPE='INDEX' AND u.o