1. 程式人生 > >oracle 遷移至 mysql 部分語句的轉換

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事件起源 ?整個事件的起源還要從筆者最近入職了一家區塊鏈金融公司來說起(為了保密性,不便透露公司名字),公司業務發展比較迅猛,突破百萬用戶也是近在眼前。整個系統都在阿裏雲上運行,每天都能看到用戶的不斷增長,即興奮又擔憂,為什麽這麽說呢? ?由於筆者過來的時候這裏業

OracleMySQL刪除語句的一個區別

-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,點選到表選項(非具體表),點選

oracleoracle使用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

OracleMysql關於型別轉換時的衝突問題

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