Mysql遷移到Oracle簡析

本文主要給大家介紹MySQL遷移到Oracle簡析,文章內(nèi)容都是筆者用心摘選和編輯的,Mysql遷移到Oracle簡析具有一定的針對性,對大家的參考意義還是比較大的,下面跟筆者一起了解下主題內(nèi)容吧。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供鷹潭企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站設計、網(wǎng)站建設、H5技術、小程序制作等業(yè)務。10年已為鷹潭眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司優(yōu)惠進行中。

 

1.數(shù)據(jù)類型的選擇。

數(shù)值類型:

Mysql有兩種類型的數(shù)字:整數(shù)(whole number)和實數(shù)(real number).

存儲整數(shù)可以選擇:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT  ,分別對應8,16,24,32,64位存儲空間。他們可存儲的范圍從-2的N-1次方到2的N-1次方-1,其中N是存儲空間的位數(shù)。

整數(shù)類型有可選的UNSIGNED屬性,表示不允許負值,這大致可以使正數(shù)的上限提高一倍。例如TINYINT  UNSIGNED可以存儲的范圍是0~255,而TINYINT的存儲范圍是-128-127.

Mysql遷移到Oracle簡析

實數(shù)是帶有小數(shù)部分的數(shù)字。DECIMAL類型用于存儲精確的小數(shù)。因為額外的計算和開銷,應該盡量只是在對小數(shù)進行精確計算時才使用。在數(shù)據(jù)量比較大時,可以考慮用bigint代替DECIMAL。

 

相比較而言,Oracle有number,int,float,binary_float,binary_double,numeric類型

number類型在oracle中會占用0~22個字節(jié)的存儲空間,是一種變長數(shù)據(jù)類型,采用oracle內(nèi)部算法,是一種軟數(shù)據(jù)類型,因此具有較好的數(shù)據(jù)精確度,通用性和可移植性較強

其中如下的這些類型都是從number類型映射而來。

NUMERIC(p,s):完全映射至NUMBER(p,s)。如果p未指定,則默認為38.

DECIMAL(p,s)或DEC(p,s):完全映射至NUMBER(p,s)。如果p為指定,則默認為38

INTEGER或INT:完全映射至NUMBER(38)類型。

SMALLINT:完全映射至NUMBER(38)類型

由于存儲結構上的不同,BINARY_FLOAT和BINARY_DOUBLE較number,可以存儲更大范圍的數(shù)據(jù),但是其精度并不如number。如果存儲金融數(shù)據(jù),建議使用number。

而如果進行科學運算,建議使用BINARY_FLOAT和BINARY_DOUBLE,因為浮點型數(shù)據(jù)使用的是硬件計算,其計算效率是非常高的。

對于Mysql中的各種int類型,建議統(tǒng)一都對應到Oracle的number類型。(number(p,s)也是完全映射到number類型的,所以無需設置精度)

字符類型:

Mysql使用VARCHAR和CHAR兩種類型。

VARCHAR是變長類型

CHAR是定長類型

CHAR這類定長類型,會刪除所有末尾的空格,在數(shù)據(jù)存儲和比較的時候,某些行為就難以理解。所以正常選擇VARCHAR為好。

 

Oracle中char屬于定長類型會使用空格進行填充。

而varchar2采用變長的方式存儲數(shù)據(jù),相對會節(jié)省空間。在存儲效率上,與char不相上下。

另外char類型同樣存在末尾空格的問題。

對于Oracle類型,由于工作習慣以及存儲的要求來考慮,應該盡可能的選擇varchar2。

 

2.Mysql中delimiter的作用

該關鍵字是告訴解釋器,該段命令是否已經(jīng)結束,mysql是否可以執(zhí)行后續(xù)腳本。

DELIMITER ;
DROP PROCEDURE IF EXISTS p_contract;  --該語句可以立即執(zhí)行
DELIMITER $$    -- 并沒有以分號結束,后續(xù)語句等待遇到$$時執(zhí)行。
CREATE PROCEDURE p_contract()
    BEGIN
。。。。。。
。。。。。
    END $$  -- 執(zhí)行中間的語句。
DELIMITER ;

3.DECLARE CONTINUE HANDLER FOR NOT FOUND

若沒有數(shù)據(jù)返回,程序繼續(xù),并將變量IS_FOUND設為0 ,這種情況是出現(xiàn)在select XX into XXX from  tablename的時候發(fā)生的。

4.UNIX時間戳與日期的相互轉(zhuǎn)換

Mysql中日期以及時間函數(shù),推薦你可以看一下這篇文章:http://www.cnblogs.com/redfox241/archive/2009/07/23/1529092.html

 

Oracle獲取UTC時間:

select to_char(sys_extract_utc(systimestamp),'yyyy-mm-dd hh34:mi:ss') from  dual;     --UTC時間

 

mysql中UNIX時間戳與日期的相互轉(zhuǎn)換

UNIX時間戳轉(zhuǎn)換為日期用函數(shù):FROM_UNIXTIME()

select FROM_UNIXTIME(1410318106);

日期轉(zhuǎn)換為UNIX時間戳用函數(shù):UNIX_TIMESTAMP()

select UNIX_TIMESTAMP('2014-09-10 11:01:46');

where DATE_FORMAT(FROM_UNIXTIME('1410318106','%Y-%m-%d %h:%m:%s'),'%Y-%m-%d  %h:%m:%s')

Oracle并沒有這類的轉(zhuǎn)換函數(shù),需要自己寫(如下的寫法也來自網(wǎng)絡)

 

--Oracle時間Date型轉(zhuǎn)換為Unix時間戳
create or replace function bill_query.oracle_to_unix(in_date DATE) return number is
BEGIN
   
   return( (in_date -TO_DATE('19700101','yyyymmdd'))*86400 - TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600);
END oracle_to_unix;
/
--Unix時間戳轉(zhuǎn)換為Oracle時間
create or replace function bill_query.unix_to_oracle(in_number NUMBER) return date is
BEGIN
    
    return(TO_DATE('19700101','yyyymmdd') + in_number/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24);
END unix_to_oracle;

/


5.Mysql中的索引和約束與Oracle的對應

primary key  ---> primary key

index ---> index

unique key –> unique index

key --->  index

 

7.AUTO_INCREMENT屬性

Mysql 中字段存在AUTO_INCREMENT屬性,Oracle中需要使用序列代替。

在用到該字段時,需要顯式的調(diào)用,插入sequence_name.nextval

 

8.Mysql創(chuàng)建表時可以通過語句查詢表是否存在并刪除(drop database if  exists  table_name)


Oracle中可以通過自定義函數(shù)來實現(xiàn)。(函數(shù)中存在DDL語句時,不能通過select的方式調(diào)用,只能通過賦值的方式。這里可以考慮在存儲過程中實現(xiàn)并調(diào)用會更方便一點。)

create or replace function hytpdtnmdb.fun_obj_ifexists(v_obj_name in  varchar2) return number  is
    num_tab   number;
    num_seq    number;
begin
      select count(1) into num_tab from all_objects where  OWNER||'.'||OBJECT_NAME = upper(v_obj_name) and OBJECT_TYPE='TABLE';
      if  num_tab = 1 then
         execute immediate 'drop table  '||v_obj_name;
         return(num_tab);
      end if;
      select count(1) into num_seq from all_objects where  OWNER||'.'||OBJECT_NAME = upper(v_obj_name) and OBJECT_TYPE='SEQUENCE';
       IF num_seq = 1 THEN
         EXECUTE IMMEDIATE 'drop SEQUENCE  '||v_obj_name;
         RETURN num_seq;
      END IF;
      return  -1;
end fun_obj_ifexists;

 

9.關于Oracle存儲過程執(zhí)行權限問題

在A用戶,需要更新、刪除、drop table 或 create table  B用戶對象的情況。
即便給用戶賦予DBA權限,在匿名存儲過程或在command窗口,可以正常執(zhí)行,在存儲過程中會存在權限不足的情況。


通過網(wǎng)上查閱資料,通過添加AUTHID  CURRENT_USER。 以CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID  CURRENT_USER as的方式創(chuàng)建存儲過程可以解決。
文章鏈接:http://blog.csdn.net/gavinloo/article/details/6869234

但偶爾仍然存在權限不足的問題,可以通過grant顯式授權的方式解決。

 

10.部分函數(shù)的差別

  • Mysql中concat可以連接多個字符串。Oracle中只能連接兩個字符。如果需要多個字符串的連接,仍然要使用'||'

  •   NUMTOYMINTERVAL ( n , 'char_expr' )
      char_expr:日期描述,可以是YEAR和MONTH;

  •   NUMTODSINTERVAL( n , 'char_expr' )

      char_expr:時間描述,可以是day、hour、minute、second;
     
      interval后面只能用數(shù)字

  •   正常情況下都可以使用 interval,但是當需要增加或減少的數(shù)值為變量時,只能用  

         numtodsinterval 和 NUMTOYMINTERVAL  替代。

看完以上關于Mysql遷移到Oracle簡析,很多讀者朋友肯定多少有一定的了解,如需獲取更多的行業(yè)知識信息 ,可以持續(xù)關注我們的行業(yè)資訊欄目的。

網(wǎng)站標題:Mysql遷移到Oracle簡析
當前URL:http://muchs.cn/article28/jogjjp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、品牌網(wǎng)站制作微信小程序、定制開發(fā)微信公眾號、服務器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設