oracle 遷移至 mysql 部分語句的轉換

前幾天吧系統從oracle往mysql上遷移,不少的語句是比較簡單的,就是一些函數的修改如to-date等java

可是也有幾個比較棘手的,這裏記錄下mysql


第1、row_number() over(partition by   sql

首先要了解下oracle中這個函數的用法,看個例子數組

select t.*,row_number() over(partition by t.owner order by y.createDate desc) rn from test toracle

這個語句的意思就是,把test這個表的數據按照owner 分組而且給每一個分組的裏面的數據加上一個序列號,數據格式以下函數


id       name      owner   createDate  rnspa

1         aa            001                              1.net

2          bb           001                              2orm

3          cc            001                             3blog

4          dd            002                             1

5           ee           002                              2

6            ff            003                               1

數據搞得不太正規,可是應該可以看懂它的意思吧,


可是在mysql中是沒有這個函數的因而乎,找啊找,總算找了個解決方法,以下

SELECT
    heyf_tmp.*,
    IF(@pdept=heyf_tmp.owner ,@rn:=@rn+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

具體是什麼意思,不是很清楚,不過先解決問題再說


第2、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了,


不過對於二維的來講好像沒有現成的函數用了,個人解決方法是改爲個表來作,把數據錄入到表中,而後去查表,這丫要給你也是能夠實現


第4、 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 ;

第4、 圖片clob的修改

系統中的功能是把圖片存在blob字段中的,,原來用的是oracle,java中對應的字段是Object,可是mysql中若是這樣作卻不能獨處圖片,緣由多是由於在往Object中寫數據時出錯了,這個號解決,只要把java中對應字段的類型改爲byte[]  就好了

相關文章
相關標籤/搜索