




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 Oracle到mysql轉(zhuǎn)換的問(wèn)題總結(jié)常用字段類(lèi)型區(qū)別oraclemysqlnumber(10,0)intnumber(10,2)decimal(10,2)varchar2varchardatedatetimeColbtext個(gè)別語(yǔ)句寫(xiě)法區(qū)別1. oracle里只可以用單引號(hào)包起字符串,mysql里可以用雙引號(hào)和單引號(hào)。2. mysql 在select * from () .,from后面是一個(gè)結(jié)果集時(shí),括號(hào)后面必須加上別名。3. mysql在delete數(shù)據(jù)時(shí)不能給表加別名,如:delete from table1 T where.,會(huì)報(bào)錯(cuò),但是可以這樣寫(xiě):delete T from ta
2、ble1 T where.。4. Mysql不支持在同一個(gè)表中先查這個(gè)表在更新這個(gè)表,舉個(gè)例子說(shuō)明一下, insert into table1 values(字段1,(select 字段2 from table1 where.), 但是可以在后面那個(gè)table1加上別名就沒(méi)有問(wèn)題了。insert into table1 values(字段1,(select T.字段2 from table1 T where.)5. MYSQL有自動(dòng)增長(zhǎng)的數(shù)據(jù)類(lèi)型,插入記錄時(shí)不用操作此字段,會(huì)自動(dòng)獲得數(shù)據(jù)值。ORACLE沒(méi)有自動(dòng)增長(zhǎng)的數(shù)據(jù)類(lèi)型,需要建立一個(gè)自動(dòng)增長(zhǎng)的序列號(hào),插入記錄時(shí)要把序列號(hào)的下一個(gè)值賦于此字
3、段。也可以自定義函數(shù)實(shí)現(xiàn)oracle的nextval。6.翻頁(yè)的sql語(yǔ)句處理,MYSQL處理翻頁(yè)的SQL語(yǔ)句比較簡(jiǎn)單,用LIMIT 開(kāi)始位置, 記錄個(gè)數(shù),例如:select * from table limit m,n,意思是從m+1開(kāi)始取n條。常見(jiàn)的函數(shù)替換1.日期轉(zhuǎn)換方面的函數(shù)oraclemysql說(shuō)明to_char(date,yyyy-MM-dd hh24:mi:ss)date_format(date,'%Y-%m-%d %H:%i:%s')注意時(shí)間格式的對(duì)應(yīng)to_date(str,yyyy-MM-dd hh24:mi:ss)str_to_date(str,'%
4、Y-%m-%d %H:%i:%s')注意時(shí)間格式to_date(str,yyyy-MM-dd hh24:mi:ss)str_to_date(str,'%Y-%m-%d%T')注意時(shí)間格式to_char()、to_number()convert(字段名,類(lèi)型)類(lèi)型轉(zhuǎn)換date + ndate_add(date,interval n day)日期增加n天select date_add(sysdate(),INTERVAL 2 DAY);add_months(date,n)date_add(date,interval n month)日期增加n個(gè)月select date_ad
5、d(sysdate(),INTERVAL 2 MONTH);date1 - date2datediff(date1,date2)日期相減獲取天數(shù)2. oracle中decode()函數(shù),可以用case when進(jìn)行替換例子:Oracle:select decode(a,b,c,d) as col1 from table1;Mysql:selectcasewhen a=b then cwhen a!=b then dend as col1from table13. oracle的函數(shù) ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2),根據(jù)col
6、1分組,在分組內(nèi)根據(jù)col2排序,改函數(shù)計(jì)算的值就表示每組內(nèi)部排序后的順序編號(hào)。Mysql沒(méi)有這個(gè)函數(shù),可以用mysql的用戶變量來(lái)實(shí)現(xiàn)例子:Oracle:select row_number() over(partition by col1 order by col2) as num from table1Mysql:select num1 as num from (select if(pdept=col1,rank:=rank+1,rank:=1) as num1,pdept:=col1 from table1 order by col2 ) H這里用到mysql的用戶變量。4. oracl
7、e的行號(hào)ROWNUM,mysql沒(méi)有這個(gè)行號(hào),也需要用用戶變量來(lái)實(shí)現(xiàn)。例子:Oracle:select * from table1 where rownum - col1=0Mysql: select * from table1,(SELECT (rowNum := 0) HH where (rowNum := rowNum + 1) - col1=05. Oracle 中的 substr (hello,a,b) mysql中是substring(hello,a,b) oracle的a=0和a=1是一樣的,都是從第一個(gè)開(kāi)始。Mysql是從0開(kāi)始。6. Oracle的nvl()對(duì)應(yīng)mysql的i
8、fnull()。7. Oracle 中的WMSYS.WM_CONCAT(),列轉(zhuǎn)行函數(shù),以逗號(hào)隔開(kāi),mysql可以用GROUP_CONCAT()進(jìn)行替換。8. Oracle的|可以用mysql的+替代,但是mysql在往某列加上字符時(shí)應(yīng)該用concat,例如給表中name字段加上x(chóng):update table1 set name=concat(x,name)。1.1 移植過(guò)程中重點(diǎn)問(wèn)題1.1.1 數(shù)據(jù)類(lèi)型差異ORACLE數(shù)據(jù)庫(kù)和MYSQL數(shù)據(jù)庫(kù)在數(shù)據(jù)類(lèi)型方面差異比較大,而且數(shù)據(jù)類(lèi)型也是一個(gè)數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的基礎(chǔ),所以找到數(shù)據(jù)類(lèi)型之間的對(duì)應(yīng)是整個(gè)系統(tǒng)進(jìn)行移植的基礎(chǔ)。以下給出了OR
9、ACLE à MYSQL數(shù)據(jù)類(lèi)型的對(duì)應(yīng)關(guān)系。 數(shù)值類(lèi)型: NUMBER à DECIMAL,精度刻度都不變 注:如果是序列用BIGINT 字符串類(lèi)型: VARCHAR2 à VARCHAR長(zhǎng)度不變。 LONG à LONGTEXT 這里有可能遇到的問(wèn)題是超過(guò)主鍵key長(zhǎng)度的問(wèn)題,根據(jù)實(shí)際情況適當(dāng)修改,如果是TEX
10、T類(lèi)型也需要指名長(zhǎng)度,否則建立key會(huì)報(bào)錯(cuò) 日期類(lèi)型: DATE à DATETIME TIMESTAMP(N) à TIMESTAMP 1.1.2 SQL語(yǔ)法差異SEQUENCE: MYSQL沒(méi)有ORACLE中的SEQUENCE對(duì)象,我們?cè)谶w移的時(shí)候需要特別注意,一般SEQUENCE有兩種用途:1、 作為表中自增字段的序列號(hào)。2、 程序中獲得自動(dòng)編號(hào)。 MYSQL數(shù)據(jù)類(lèi)型中存在
11、0;AUTO_INCREMENT為自增數(shù)據(jù)類(lèi)型。我們可以利用該數(shù)據(jù)類(lèi)型變通一下來(lái)滿足我們現(xiàn)有系統(tǒng)中的SEQUENCE功能。1、 對(duì)于ORACLE中SEQUENCE作為表的自增列一般是通過(guò)與觸發(fā)器綁定實(shí)現(xiàn)的,在MYSQL中我們可以直接利用MYSQL的AUTO_INCREMENT類(lèi)型來(lái)實(shí)現(xiàn)。2、 ORACLE開(kāi)發(fā)的應(yīng)用程序中直接SELECT SEQUENCT來(lái)獲得自動(dòng)編號(hào),對(duì)于這個(gè)功能我們也可以利用MYSQL的AUTO_INCREMENT類(lèi)型來(lái)實(shí)現(xiàn)。 首先介紹一個(gè)函數(shù),我們可以利用如下函數(shù)查詢最后一個(gè)序列號(hào)的值: mysql> SE
12、LECT LAST_INSERT_ID();+-+| LAST_INSERT_ID() |+-+| 3 |+-+1 row in set (0.06 sec) 我們可以創(chuàng)建一個(gè)含有自增列的表,對(duì)該表進(jìn)行INSERT操作后,再利用LAST_INSERT_ID()函數(shù)來(lái)獲得剛剛INSERT的值,也就是相當(dāng)于ORA
13、CLE中的SEQUENCE. NETVAL。也就是INSERT操作+SELECT操作獲得一個(gè)自動(dòng)編號(hào)。 mysql> CREATE TABLE MOCHA_BE_SEQUENCE(ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT);Query OK, 0 rows affected (0.63 sec) mysql> INSERT INTO M
14、OCHA_BE_SEQUENCE VALUES(NULL);Query OK, 1 row affected (0.09 sec) mysql> SELECT LAST_INSERT_ID();+-+| LAST_INSERT_ID() |+-+| 1 |+-+1
15、;row in set (0.05 sec) mysql> INSERT INTO MOCHA_BE_SEQUENCE VALUES(NULL);Query OK, 1 row affected (0.06 sec) mysql> SELECT LAST_INSERT_ID();+-+| LAST_INSERT_ID() |+-+|
16、60; 2 |+-+1 row in set (0.00 sec) BLOG: ORACLE和MYSQL都支持二進(jìn)制大對(duì)象,數(shù)據(jù)類(lèi)型的名稱(chēng)都是BLOB,在存儲(chǔ)方面都是一樣的,BLOB列沒(méi)有字符集,并且排序和比較基于列值字節(jié)位數(shù);在開(kāi)發(fā)應(yīng)用程序時(shí)需要注意對(duì)兩種數(shù)據(jù)庫(kù)BLOG類(lèi)型的操作的差異。 視圖 Mysql視圖限制(1)SELECT語(yǔ)句不能包含F(xiàn)ROM子句中的子查詢。
17、(2)SELECT語(yǔ)句不能引用系統(tǒng)或用戶變量。(3)SELECT語(yǔ)句不能引用預(yù)處理語(yǔ)句參數(shù)。(4)在存儲(chǔ)子程序內(nèi),定義不能引用子程序參數(shù)或局部變量。(5)在定義中引用的表或視圖必須存在。但是,創(chuàng)建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在這類(lèi)問(wèn)題,可使用CHECK TABLE語(yǔ)句。(6)在定義中不能引用TEMPORARY表,不能創(chuàng)建TEMPORARY視圖。(7)在視圖定義中命名的表必須已存在。(8)不能將觸發(fā)程序與視圖關(guān)聯(lián)在一起。 我所要遷移的系統(tǒng)中的視圖90%用到了子查詢,解決方案是首先重新寫(xiě)查詢語(yǔ)句,盡量避免子查詢,避免不了,就將子查詢中的內(nèi)容,單獨(dú)
18、create成一個(gè)新的視圖,然后再建立所需要的視圖。 例子: Oracle中帶子查詢的視圖: CREATE OR REPLACE VIEW MOCHA_IM_ALL_ACCOUNT_VIEW ASSELECT USER_ID AS ID, USER_NAME AS NAME, CONCAT(CONCAT(CONCAT(NVL(ORG.ORG_CODE,'00000001.10000000'), '.00.'
19、;), PERSON_POSITION.PERSON_LEVEL), LPAD(PERSON_POSITION.ORG_PERSON_NO,9,'0') AS CODE, NVL(ORG.ORG_LEVEL, 1) AS REC_LEVEL, 'PERSON' AS REC_TYPEFROM (SELECT PERSON.USER_ID , PERSON.USER_NAME, NVL(POSITION.O
20、RG_ID, -1) AS ORG_ID, NVL(POSITION.ORG_PERSON_NO, 0) AS ORG_PERSON_NO, NVL(POSITION.PERSON_LEVEL, '64') AS PERSON_LEVEL FROM MOCHA_IM_PERSON_POSITION POSITION, MOCHA_IM_PERSON PERSON WHERE PERSON.USER_I
21、D = POSITION.USER_ID (+) AND PERSON.ADMIN_FLAG = '0' And PERSON.STATUS='A') PERSON_POSITION, MOCHA_IM_ORG_VIEW ORGWHERE PERSON_POSITION.ORG_ID = ORG.ORG_ID (+)UNION ALLSELECT USER_ID AS
22、0;ID, USER_NAME AS NAME, '00000001.20000000.00.64000000000' AS CODE, 1 AS REC_LEVEL, 'PERSON' AS REC_TYPEFROM MOCHA_IM_PERSON PERSON WHERE PERSON.ADMIN_FLAG = '0' And PERSON.ST
23、ATUS='I'UNION ALLSELECT USER_ID AS ID, USER_NAME AS NAME, '00000001.30000000.00.64000000000' AS CODE,1 AS REC_LEVEL, 'PERSON' AS REC_TYPEFROM MOCHA_IM_PERSON WHERE ADMIN_FLAG =
24、;'1' AND STATUS='A'UNION ALLSELECT LPAD(ORG_ID,20,' ') AS ID, ORG_NAME AS NAME, ORG_CODE AS CODE,ORG_LEVEL AS REC_LEVEL, 'ORG' AS REC_TYPE FROM MOCHA_IM_ORG_VIEWUNION
25、160;ALL SELECT '-1' AS ID, '未分派人員' AS NAME, '00000001.10000000' AS CODE, 1 AS REC_LEVEL, 'ORG' AS REC_TYPE FROM DUALUNION ALL SELECT '-2' AS ID,&
26、#160;'待刪除人員' AS NAME, '00000001.20000000' AS CODE, 1 AS REC_LEVEL, 'ORG' AS REC_TYPE FROM DUALUNION ALL SELECT '-3' AS ID, '系統(tǒng)管理員' AS NAME, '00000
27、001.30000000' AS CODE, 1 AS REC_LEVEL, 'ORG' AS REC_TYPE From DUAL/ 轉(zhuǎn)為mysql: CREATE OR REPLACE VIEW PERSON_POSITION ASSELECT PERSON.USER_ID , PERSON.USER_NAME, IFNULL(POSITION.O
28、RG_ID, -1) AS ORG_ID, IFNULL(POSITION.ORG_PERSON_NO, 0) AS ORG_PERSON_NO, IFNULL(POSITION.PERSON_LEVEL, '64') AS PERSON_LEVEL FROM MOCHA_IM_PERSON_POSITION POSITION LEFT JOIN MOCHA_IM_PERSON PERSO
29、N ON PERSON.USER_ID = POSITION.USER_ID WHERE PERSON.ADMIN_FLAG = '0' And PERSON.STATUS='A'/ CREATE OR REPLACE VIEW MOCHA_IM_ALL_ACCOUNT_VIEW ASSELECT USER_ID AS ID, USER_NAME AS
30、160;NAME,CONCAT(CONCAT(CONCAT(IFNULL(ORG.ORG_CODE,'00000001.10000000'), '.00.'),PERSON_POSITION.PERSON_LEVEL), LPAD(PERSON_POSITION.ORG_PERSON_NO,9,'0') AS CODE, IFNULL(ORG.ORG_LEVEL, 1) AS REC_LEVEL, 'PERSON' AS
31、REC_TYPEFROM MOCHA_IM_ORG_VIEW ORG LEFT JOIN PERSON_POSITION ON PERSON_POSITION.ORG_ID = ORG.ORG_ID UNION ALLSELECT USER_ID AS ID, USER_NAME AS NAME, '00000001.20000000.00.64000000000' AS
32、0;CODE, 1 AS REC_LEVEL, 'PERSON' AS REC_TYPEFROM MOCHA_IM_PERSON PERSON WHERE PERSON.ADMIN_FLAG = '0' And PERSON.STATUS='I'UNION ALLSELECT USER_ID AS ID, USER_NAME AS NAME
33、, '00000001.30000000.00.64000000000' AS CODE,1 AS REC_LEVEL, 'PERSON' AS REC_TYPEFROM MOCHA_IM_PERSON WHERE ADMIN_FLAG = '1' AND STATUS='A'UNION ALLSELECT LPAD(ORG_ID,20,'
34、39;) AS ID, ORG_NAME AS NAME, ORG_CODE AS CODE,ORG_LEVEL AS REC_LEVEL, 'ORG' AS REC_TYPE FROM MOCHA_IM_ORG_VIEWUNION ALL SELECT '-1' AS ID, '未分派人員' AS NAME,
35、;'00000001.10000000' AS CODE, 1 AS REC_LEVEL, 'ORG' AS REC_TYPE FROM DUALUNION ALL SELECT '-2' AS ID, '待刪除人員' AS NAME, '00000001.20000000' AS CODE, 1&
36、#160;AS REC_LEVEL, 'ORG' AS REC_TYPE FROM DUALUNION ALL SELECT '-3' AS ID, '系統(tǒng)管理員' AS NAME, '00000001.30000000' AS CODE, 1 AS REC_LEVEL, 'ORG' A
37、S REC_TYPE From DUAL/ 觸發(fā)器,函數(shù),存儲(chǔ)過(guò)程 語(yǔ)法的區(qū)別,難點(diǎn)在于異常處理模塊,其他要關(guān)注的比如定義游標(biāo)的語(yǔ)法,mysql控制流程等等。對(duì)于觸發(fā)器來(lái)講對(duì)于具有相同觸發(fā)程序動(dòng)作時(shí)間和事件的給定表,不能有兩個(gè)觸發(fā)程序。例如,對(duì)于某一表,不能有兩個(gè)BEFORE UPDATE觸發(fā)程序。但可以有1個(gè)BEFORE UPDATE觸發(fā)程序和1個(gè)BEFORE INSERT觸發(fā)程序,或1個(gè)BEFORE UPDATE觸發(fā)程序和1個(gè)AFTER UPDATE觸發(fā)程序。就是說(shuō)mysql不支持oracl
38、e中create trigger * before insert or Update or delete on *.此時(shí)應(yīng)該把這個(gè)觸發(fā)器拆分為3個(gè)觸發(fā)器。 例子: Oracle下觸發(fā)器: CREATE OR REPLACE TRIGGER MOCHA_IM_DUTY_TRGBEFORE INSERT OR UPDATE OR DELETE ON MOCHA_
39、IM_DUTYFOR EACH ROWDECLAREbefImg VARCHAR2(2000);afterImg VARCHAR2(2000);action VARCHAR2(10);action_module VARCHAR2(10);info_category VARCHAR2(20);BEGINaction_module := 'IM'info_category := 'duty'befImg := 'DUTY_ID
40、39; | :old.duty_id | 'DUTY_NAME' | :old.duty_name;afterImg := 'DUTY_ID' | :new.duty_id | 'DUTY_NAME' | :new.duty_name; IF (:old.duty_id is null) THENaction := 'Insert&
41、#39;befImg := ''INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (SYSDATE, action, action_module, info_category, befImg, afterImg);ELS
42、IF (:new.duty_id is null) THEN action := 'Delete'afterImg := ''INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE)
43、0;VALUES (SYSDATE, action, action_module, info_category, befImg, afterImg);ELSEaction := 'Update'IF(befImg != afterImg) THEN INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTION
44、_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (SYSDATE, action, action_module, info_category, befImg, afterImg);END IF;END IF;EXCEPTION WHEN OTHERS then &
45、#160; befImg := ''end;/mysql下: CREATE TRIGGER MOCHA_IM_DUTY_TRG_INSERTBEFORE INSERT ON MOCHA_IM_DUTYFOR EACH ROWBEGINDECLARE befImg VARCHAR(2000);DECLARE afterImg VARCHAR(2000);DECLARE act
46、ion VARCHAR(10);DECLARE action_module VARCHAR(10);DECLARE info_category VARCHAR(20);DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUNDbeginset befImg = ''end;set action_module = 'IM'set info_
47、category = 'duty'set afterImg =CONCAT( 'DUTY_ID' , new.duty_id , 'DUTY_NAME' , new.duty_name);set action = 'Insert'set befImg = ''INSERT INTO MOCHA_IM_AUDIT_LOG
48、;(ACTION_TIMESTAMP, ACTION, ACTION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (now(), action, action_module, info_category, befImg, afterImg);end;/ CREATE TRIGGER MOCHA_IM_DUTY_TRG_DELBEFORE DEL
49、ETE ON MOCHA_IM_DUTYFOR EACH ROWBEGINDECLARE befImg VARCHAR(2000);DECLARE afterImg VARCHAR(2000);DECLARE action VARCHAR(10);DECLARE action_module VARCHAR(10);DECLARE info_category VARCHAR(20);DECLARE exit HANDLER FO
50、R SQLEXCEPTION,SQLWARNING,NOT FOUNDbeginset befImg = ''end;set action_module = 'IM'set info_category = 'duty'set befImg = CONCAT('DUTY_ID' , old.duty_id , 'DUTY_NAME'
51、0;, old.duty_name);set action = 'Delete'set afterImg = ''INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (now(), action,
52、 action_module, info_category, befImg, afterImg);end;/ CREATE TRIGGER MOCHA_IM_DUTY_TRG_UPDATEBEFORE UPDATE ON MOCHA_IM_DUTYFOR EACH ROWBEGINDECLARE befImg VARCHAR(2000);DECLARE afterImg VARCHAR(2000);DECLARE
53、 action VARCHAR(10);DECLARE action_module VARCHAR(10);DECLARE info_category VARCHAR(20);DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUNDbeginset befImg = ''end;set action_module = 'IM'set
54、160;info_category = 'duty'set befImg = CONCAT('DUTY_ID' , old.duty_id , 'DUTY_NAME' , old.duty_name);set afterImg =CONCAT( 'DUTY_ID' , new.duty_id , 'DUTY_NAME' ,
55、60;new.duty_name); IF (old.duty_id is null) THENset action = 'Insert'set befImg = ''ELSEIF (new.duty_id is null) THEN set action = 'Delete'set afterImg = '&
56、#39;ELSEset action = 'Update'IF(befImg != afterImg) THEN INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (now(),
57、60;action, action_module, info_category, befImg, afterImg);END IF;END IF;end;/ 在聲過(guò)程和函數(shù)時(shí)注意過(guò)程支持inout參數(shù)函數(shù)不支持,mysql下函數(shù)是returns Oracle下過(guò)程: create or replace procedure MOCHA_FE_OPEN_DOC_SP(v_sql VARCHAR2)ISbeginexecute immediate
58、60;' insert into MOCHA_FE_DOC_BODY_TEMP '|v_sql;end MOCHA_FE_OPEN_DOC_SP;/Mysql下:create procedure MOCHA_FE_OPEN_DOC_SP(v_sql VARCHAR(200)beginset sqltext=CONCAT( ' insert into MOCHA_FE_DOC_BODY_TEMP ',v_sql);
59、prepare stmt from sqltext;execute stmt;end / Oracle下函數(shù): CREATE OR REPLACE FUNCTION GET_PER_NAME_LEVEL(v_UserId VARCHAR2)RETURN VARCHAR2 ISv_UserName VARCHAR2(30);v_PrimaryPosition VARCHAR2(1);v_PersonLevel VARCHAR2(
60、2);v_LevelName VARCHAR2(4000);v_Result VARCHAR2(4000);v_RecCount NUMBER;CURSOR c_PersonPosition ISSELECT PERSON.USER_NAME, POSITION.PERSON_LEVEL, POSITION.PRIMARY_POSITION, PERSON_LEVEL.LEVEL_NAMEFROM MOCHA_IM_PERSON PERSON, MOCHA_IM_PERSON
61、_POSITION POSITION, MOCHA_IM_PERSON_LEVEL PERSON_LEVELWHERE PERSON.USER_ID = POSITION.USER_ID AND POSITION.PERSON_LEVEL = PERSON_LEVEL.PERSON_LEVEL AND POSITION.USER_ID = v_UserIdORDER BY POSITION.PRIMARY_POSITION D
62、ESC;BEGIN SELECT COUNT(PERSON_LEVEL) INTO v_RecCount FROM MOCHA_IM_PERSON_POSITION POSITION WHERE USER_ID = v_UserId; IF v_RecCount=0 THEN SELECT USER_NAME INTO v_Result FROM&
63、#160;MOCHA_IM_PERSON PERSON WHERE USER_ID = v_UserId; ELSE OPEN c_PersonPosition; LOOP FETCH c_PersonPosition INTO v_UserName, v_PersonLevel, v_Pri
64、maryPosition, v_LevelName; EXIT WHEN c_PersonPosition%NOTFOUND; v_Result := NVL(v_Result, CONCAT(CONCAT(v_Result, v_UserName), ''); IF (v_PrimaryPosition&
65、#160;= '1' AND (v_RecCount >1 OR SUBSTR(v_PersonLevel,2) < '3') THEN v_Result := CONCAT(v_Result, v_LevelName); ELSIF (v_RecCount >0 AND v_PrimaryPosition =
66、 '0') THEN v_Result := CONCAT(CONCAT(v_Result, '兼'), v_LevelName); END IF; END LOOP; CLOSE c_PersonPosition; IF LENGTH(v_Result)>
67、;0 THEN v_Result := CONCAT(v_Result, ''); END IF;IF SUBSTR(v_Result, LENGTH(v_Result)-1) = '' THEN v_Result := SUBSTR(v_Result,1,LENGTH(v_Result)-2);END IF; END
68、60;IF; RETURN v_Result;END; Mysql下函數(shù): CREATE FUNCTION GET_PER_NAME_LEVEL(v_UserId VARCHAR(30)RETURNS VARCHAR(30)BEGIN DECLARE v_UserName VARCHAR(30);DECLARE v_PrimaryPosition VARCHAR(1);DECLARE v_PersonLevel VARCHAR(2);
69、DECLARE v_LevelName VARCHAR(4000);DECLARE v_Result VARCHAR(4000);DECLARE v_RecCount DECIMAL;DECLARE c_PersonPosition CURSOR FORSELECT PERSON.USER_NAME, POSITION.PERSON_LEVEL, POSITION.PRIMARY_POSITION, PERSON_LEVEL.LEVEL_NAMEFROM
70、MOCHA_IM_PERSON PERSON, MOCHA_IM_PERSON_POSITION POSITION, MOCHA_IM_PERSON_LEVEL PERSON_LEVELWHERE PERSON.USER_ID = POSITION.USER_ID AND POSITION.PERSON_LEVEL = PERSON_LEVEL.PERSON_LEVEL AND POSITION.USER_ID = v_UserIdOR
71、DER BY POSITION.PRIMARY_POSITION DESC; SELECT COUNT(PERSON_LEVEL) INTO v_RecCount FROM MOCHA_IM_PERSON_POSITION POSITION WHERE USER_ID = v_UserId; IF v_RecCount=0 THEN SELECT
72、 USER_NAME INTO v_Result FROM MOCHA_IM_PERSON PERSON WHERE USER_ID = v_UserId; ELSE OPEN c_PersonPosition; REPEAT FETCH c_PersonPosition
73、INTO v_UserName, v_PersonLevel, v_PrimaryPosition, v_LevelName; IF NOT done THEN set v_Result = IFNULL(v_Result, CONCAT(CONCAT(v_Result, v_UserName), '');
74、60; IF (v_PrimaryPosition = '1' AND (v_RecCount >1 OR SUBSTR(v_PersonLevel,2) < '3') THEN set v_Result = CONCAT(v_Result, v_LevelName); ELSEIF (v_R
75、ecCount >0 AND v_PrimaryPosition = '0') THEN set v_Result = CONCAT(CONCAT(v_Result, '兼'), v_LevelName); END IF;END IF; UNTIL done END REPEAT;
76、60; CLOSE c_PersonPosition; IF LENGTH(v_Result)>0 THEN set v_Result = CONCAT(v_Result, ''); END IF;IF SUBSTR(v_Result, LENGTH(v_Result)-1) = ''
77、0;THEN set v_Result = SUBSTR(v_Result,1,LENGTH(v_Result)-2);END IF; END IF; RETURN v_Result;END;/ 索引 普通索引,唯一索引,全文索引都支持,但是不支持bitmap索引。 其他: Oracle用|連接字符串,mysql不支持|,但可以用CONCAT來(lái)連接,nvl在mysql中是ifnull,instr函數(shù)oracle與mysql有些不同
78、,oracle支持的參數(shù)比mysql多,功能更強(qiáng)大,但是mysql有substring_index配合substring,length可以做絕大多數(shù)的字符的操作為了支持中文,字符集選擇utf8,為了支持事務(wù)和行級(jí)鎖選擇存儲(chǔ)引擎為InnoDB這些可以在mysql的配置文件里去改,也可以在建表的時(shí)候?qū)戇M(jìn)sql中 最后mysql與oracle的語(yǔ)法(臨時(shí)表,表的comment,定義變量啊等等)函數(shù)上的區(qū)別還有很多。MySQL轉(zhuǎn)換Oracle的七大注意事項(xiàng)有很多應(yīng)用項(xiàng)目, 剛起步的時(shí)候用MySQL數(shù)據(jù)庫(kù)基本上能實(shí)現(xiàn)各種功能需求,隨著應(yīng)用用戶的增多,數(shù)據(jù)量的增加,MySQL漸漸地出
79、現(xiàn)不堪重負(fù)的情況:連接很慢甚至宕機(jī),于是就有MySQL轉(zhuǎn)換Oracle的需求,應(yīng)用程序也要相應(yīng)做一些修改。下面總結(jié)出MySQL轉(zhuǎn)換Oracle的幾點(diǎn)注意事項(xiàng),希望對(duì)大家有所幫助。1自動(dòng)增長(zhǎng)的數(shù)據(jù)類(lèi)型處理MySQL有自動(dòng)增長(zhǎng)的數(shù)據(jù)類(lèi)型,插入記錄時(shí)不用操作此字段,會(huì)自動(dòng)獲得數(shù)據(jù)值。Oracle沒(méi)有自動(dòng)增長(zhǎng)的數(shù)據(jù)類(lèi)型,需要建立一個(gè)自動(dòng)增長(zhǎng)的序列號(hào),插入記錄時(shí)要把序列號(hào)的下一個(gè)值賦于此字段。CREATE SEQUENCE 序列號(hào)的名稱(chēng) (最好是表名 序列號(hào)標(biāo)記) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;其中最大的值按字段的長(zhǎng)度來(lái)
80、定, 如果定義的自動(dòng)增長(zhǎng)的序列號(hào) NUMBER(6) , 最大值為999999 INSERT 語(yǔ)句插入這個(gè)字段值為: 序列號(hào)的名稱(chēng).NEXTVAL2. 單引號(hào)的處理MySQL里可以用雙引號(hào)包起字符串,Oracle里只可以用單引號(hào)包起字符串。在插入和修改字符串前必須做單引號(hào)的替換:把所有出現(xiàn)的一個(gè)單引號(hào)替換成兩個(gè)單引號(hào)。3. 翻頁(yè)的SQL語(yǔ)句的處理MySQL處理翻頁(yè)的SQL語(yǔ)句比較簡(jiǎn)單,用LIMIT 開(kāi)始位置, 記錄個(gè)數(shù);PHP里還可以用SEEK定位到結(jié)果集的位置。Oracle處理翻頁(yè)的SQL語(yǔ)句就比較繁瑣了。每個(gè)結(jié)果集只有一個(gè)ROWNUM字段標(biāo)明它的位置, 并且只能用ROWNUMlt;100, 不能用ROWNUM>80。 以下是經(jīng)過(guò)分析后較好的兩種Oracle翻頁(yè)SQL語(yǔ)句( ID是唯一關(guān)鍵字的字段名 ):語(yǔ)句一:1. SELECT
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 別墅拆改合同范本
- 代銷(xiāo)合同范本同+
- 個(gè)人買(mǎi)賣(mài)瓷器合同范例
- 業(yè)務(wù)結(jié)算補(bǔ)充合同范本
- 俄語(yǔ)貿(mào)易合同范本
- 務(wù)工合同范本可
- 買(mǎi)斷畫(huà)稿合同范本
- 公司注銷(xiāo)離職合同范本
- 倉(cāng)庫(kù)搬遷合同范本
- 農(nóng)莊種菜養(yǎng)殖合同范本
- 大學(xué)生職業(yè)素養(yǎng)訓(xùn)練(第六版)課件 第五單元學(xué)會(huì)有效溝通
- 醫(yī)院醫(yī)療項(xiàng)目收費(fèi)管理制度
- 建筑師負(fù)責(zé)制工程建設(shè)項(xiàng)目建筑師標(biāo)準(zhǔn)服務(wù)內(nèi)容與流程
- 湖北省石首楚源“源網(wǎng)荷儲(chǔ)”一體化項(xiàng)目可研報(bào)告
- 浙江建設(shè)職業(yè)技術(shù)學(xué)院?jiǎn)握小堵殬I(yè)技能測(cè)試》參考試題庫(kù)(含答案)
- 醫(yī)學(xué)教材 《中國(guó)變應(yīng)性鼻炎診斷和治療指南》解讀課件
- 排球教學(xué)課件教學(xué)課件
- 安徽省滁州市2024年小升初英語(yǔ)試卷(含答案)
- 初中體育與健康 初一上期 水平四(七年級(jí))田徑大單元教學(xué)設(shè)計(jì)+蹲踞式跳遠(yuǎn)教案
- 香港(2024年-2025年小學(xué)二年級(jí)語(yǔ)文)人教版階段練習(xí)試卷(含答案)
- 黑龍江省哈爾濱市2022-2023學(xué)年七年級(jí)下學(xué)期數(shù)學(xué)期末試題(含答案)
評(píng)論
0/150
提交評(píng)論