Oracle到mysql轉(zhuǎn)換的問(wèn)題總結(jié)_第1頁(yè)
Oracle到mysql轉(zhuǎn)換的問(wèn)題總結(jié)_第2頁(yè)
Oracle到mysql轉(zhuǎn)換的問(wèn)題總結(jié)_第3頁(yè)
Oracle到mysql轉(zhuǎn)換的問(wèn)題總結(jié)_第4頁(yè)
Oracle到mysql轉(zhuǎn)換的問(wèn)題總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論