本文主要給大家介紹MySQL遷移到Oracle簡(jiǎn)析,文章內(nèi)容都是筆者用心摘選和編輯的,Mysql遷移到Oracle簡(jiǎn)析具有一定的針對(duì)性,對(duì)大家的參考意義還是比較大的,下面跟筆者一起了解下主題內(nèi)容吧。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供鷹潭企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為鷹潭眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
1.數(shù)據(jù)類型的選擇。
數(shù)值類型:
Mysql有兩種類型的數(shù)字:整數(shù)(whole number)和實(shí)數(shù)(real number).
存儲(chǔ)整數(shù)可以選擇:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT ,分別對(duì)應(yīng)8,16,24,32,64位存儲(chǔ)空間。他們可存儲(chǔ)的范圍從-2的N-1次方到2的N-1次方-1,其中N是存儲(chǔ)空間的位數(shù)。
整數(shù)類型有可選的UNSIGNED屬性,表示不允許負(fù)值,這大致可以使正數(shù)的上限提高一倍。例如TINYINT UNSIGNED可以存儲(chǔ)的范圍是0~255,而TINYINT的存儲(chǔ)范圍是-128-127.
實(shí)數(shù)是帶有小數(shù)部分的數(shù)字。DECIMAL類型用于存儲(chǔ)精確的小數(shù)。因?yàn)轭~外的計(jì)算和開銷,應(yīng)該盡量只是在對(duì)小數(shù)進(jìn)行精確計(jì)算時(shí)才使用。在數(shù)據(jù)量比較大時(shí),可以考慮用bigint代替DECIMAL。
相比較而言,Oracle有number,int,float,binary_float,binary_double,numeric類型
number類型在oracle中會(huì)占用0~22個(gè)字節(jié)的存儲(chǔ)空間,是一種變長(zhǎng)數(shù)據(jù)類型,采用oracle內(nèi)部算法,是一種軟數(shù)據(jù)類型,因此具有較好的數(shù)據(jù)精確度,通用性和可移植性較強(qiáng)
其中如下的這些類型都是從number類型映射而來。
NUMERIC(p,s):完全映射至NUMBER(p,s)。如果p未指定,則默認(rèn)為38.
DECIMAL(p,s)或DEC(p,s):完全映射至NUMBER(p,s)。如果p為指定,則默認(rèn)為38
INTEGER或INT:完全映射至NUMBER(38)類型。
SMALLINT:完全映射至NUMBER(38)類型
由于存儲(chǔ)結(jié)構(gòu)上的不同,BINARY_FLOAT和BINARY_DOUBLE較number,可以存儲(chǔ)更大范圍的數(shù)據(jù),但是其精度并不如number。如果存儲(chǔ)金融數(shù)據(jù),建議使用number。
而如果進(jìn)行科學(xué)運(yùn)算,建議使用BINARY_FLOAT和BINARY_DOUBLE,因?yàn)楦↑c(diǎn)型數(shù)據(jù)使用的是硬件計(jì)算,其計(jì)算效率是非常高的。
對(duì)于Mysql中的各種int類型,建議統(tǒng)一都對(duì)應(yīng)到Oracle的number類型。(number(p,s)也是完全映射到number類型的,所以無需設(shè)置精度)
字符類型:
Mysql使用VARCHAR和CHAR兩種類型。
VARCHAR是變長(zhǎng)類型
CHAR是定長(zhǎng)類型
CHAR這類定長(zhǎng)類型,會(huì)刪除所有末尾的空格,在數(shù)據(jù)存儲(chǔ)和比較的時(shí)候,某些行為就難以理解。所以正常選擇VARCHAR為好。
Oracle中char屬于定長(zhǎng)類型會(huì)使用空格進(jìn)行填充。
而varchar2采用變長(zhǎng)的方式存儲(chǔ)數(shù)據(jù),相對(duì)會(huì)節(jié)省空間。在存儲(chǔ)效率上,與char不相上下。
另外char類型同樣存在末尾空格的問題。
對(duì)于Oracle類型,由于工作習(xí)慣以及存儲(chǔ)的要求來考慮,應(yīng)該盡可能的選擇varchar2。
2.Mysql中delimiter的作用
該關(guān)鍵字是告訴解釋器,該段命令是否已經(jīng)結(jié)束,mysql是否可以執(zhí)行后續(xù)腳本。
DELIMITER ; DROP PROCEDURE IF EXISTS p_contract; --該語句可以立即執(zhí)行 DELIMITER $$ -- 并沒有以分號(hào)結(jié)束,后續(xù)語句等待遇到$$時(shí)執(zhí)行。 CREATE PROCEDURE p_contract() BEGIN 。。。。。。 。。。。。 END $$ -- 執(zhí)行中間的語句。 DELIMITER ;
3.DECLARE CONTINUE HANDLER FOR NOT FOUND
若沒有數(shù)據(jù)返回,程序繼續(xù),并將變量IS_FOUND設(shè)為0 ,這種情況是出現(xiàn)在select XX into XXX from tablename的時(shí)候發(fā)生的。
4.UNIX時(shí)間戳與日期的相互轉(zhuǎn)換
Mysql中日期以及時(shí)間函數(shù),推薦你可以看一下這篇文章:http://www.cnblogs.com/redfox241/archive/2009/07/23/1529092.html
Oracle獲取UTC時(shí)間:
select to_char(sys_extract_utc(systimestamp),'yyyy-mm-dd hh34:mi:ss') from dual; --UTC時(shí)間
mysql中UNIX時(shí)間戳與日期的相互轉(zhuǎn)換
UNIX時(shí)間戳轉(zhuǎn)換為日期用函數(shù):FROM_UNIXTIME()
select FROM_UNIXTIME(1410318106);
日期轉(zhuǎn)換為UNIX時(shí)間戳用函數(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)絡(luò))
--Oracle時(shí)間Date型轉(zhuǎn)換為Unix時(shí)間戳 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時(shí)間戳轉(zhuǎn)換為Oracle時(shí)間 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的對(duì)應(yīng)
primary key ---> primary key
index ---> index
unique key –> unique index
key ---> index
7.AUTO_INCREMENT屬性
Mysql 中字段存在AUTO_INCREMENT屬性,Oracle中需要使用序列代替。
在用到該字段時(shí),需要顯式的調(diào)用,插入sequence_name.nextval
8.Mysql創(chuàng)建表時(shí)可以通過語句查詢表是否存在并刪除(drop database if exists table_name)
Oracle中可以通過自定義函數(shù)來實(shí)現(xiàn)。(函數(shù)中存在DDL語句時(shí),不能通過select的方式調(diào)用,只能通過賦值的方式。這里可以考慮在存儲(chǔ)過程中實(shí)現(xiàn)并調(diào)用會(huì)更方便一點(diǎn)。)
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.關(guān)于Oracle存儲(chǔ)過程執(zhí)行權(quán)限問題
在A用戶,需要更新、刪除、drop table 或 create table B用戶對(duì)象的情況。
即便給用戶賦予DBA權(quán)限,在匿名存儲(chǔ)過程或在command窗口,可以正常執(zhí)行,在存儲(chǔ)過程中會(huì)存在權(quán)限不足的情況。
通過網(wǎng)上查閱資料,通過添加AUTHID CURRENT_USER。 以CREATE OR REPLACE procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as的方式創(chuàng)建存儲(chǔ)過程可以解決。
文章鏈接:http://blog.csdn.net/gavinloo/article/details/6869234
但偶爾仍然存在權(quán)限不足的問題,可以通過grant顯式授權(quán)的方式解決。
10.部分函數(shù)的差別
Mysql中concat可以連接多個(gè)字符串。Oracle中只能連接兩個(gè)字符。如果需要多個(gè)字符串的連接,仍然要使用'||'
NUMTOYMINTERVAL ( n , 'char_expr' )
char_expr:日期描述,可以是YEAR和MONTH;
NUMTODSINTERVAL( n , 'char_expr' )
char_expr:時(shí)間描述,可以是day、hour、minute、second;
interval后面只能用數(shù)字
正常情況下都可以使用 interval,但是當(dāng)需要增加或減少的數(shù)值為變量時(shí),只能用
numtodsinterval 和 NUMTOYMINTERVAL 替代。
看完以上關(guān)于Mysql遷移到Oracle簡(jiǎn)析,很多讀者朋友肯定多少有一定的了解,如需獲取更多的行業(yè)知識(shí)信息 ,可以持續(xù)關(guān)注我們的行業(yè)資訊欄目的。