Oracle到mysql转换的问题总结备课讲稿.doc

上传人:豆**** 文档编号:33583732 上传时间:2022-08-11 格式:DOC 页数:38 大小:184KB
返回 下载 相关 举报
Oracle到mysql转换的问题总结备课讲稿.doc_第1页
第1页 / 共38页
Oracle到mysql转换的问题总结备课讲稿.doc_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《Oracle到mysql转换的问题总结备课讲稿.doc》由会员分享,可在线阅读,更多相关《Oracle到mysql转换的问题总结备课讲稿.doc(38页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、如有侵权,请联系网站删除,仅供学习与交流Oracle到mysql转换的问题总结【精品文档】第 38 页 Oracle到mysql转换的问题总结常用字段类型区别oraclemysqlnumber(10,0)intnumber(10,2)decimal(10,2)varchar2varchardatedatetimeColbtext个别语句写法区别1. oracle里只可以用单引号包起字符串,mysql里可以用双引号和单引号。2. mysql 在select * from () .,from后面是一个结果集时,括号后面必须加上别名。3. mysql在delete数据时不能给表加别名,如:delet

2、e from table1 T where.,会报错,但是可以这样写:delete T from table1 T where.。4. Mysql不支持在同一个表中先查这个表在更新这个表,举个例子说明一下, insert into table1 values(字段1,(select 字段2 from table1 where.), 但是可以在后面那个table1加上别名就没有问题了。insert into table1 values(字段1,(select T.字段2 from table1 T where.)5. MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。O

3、RACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。也可以自定义函数实现oracle的nextval。6.翻页的sql语句处理,MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数,例如:select * from table limit m,n,意思是从m+1开始取n条。常见的函数替换1.日期转换方面的函数oraclemysql说明to_char(date,yyyy-MM-dd hh24:mi:ss)date_format(date,%Y-%m-%d %H:%i:%s)注意时间格式的对应to_date(str,yyy

4、y-MM-dd hh24:mi:ss)str_to_date(str,%Y-%m-%d %H:%i:%s)注意时间格式to_date(str,yyyy-MM-dd hh24:mi:ss)str_to_date(str,%Y-%m-%d%T)注意时间格式to_char()、to_number()convert(字段名,类型)类型转换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)

5、日期增加n个月select date_add(sysdate(),INTERVAL 2 MONTH);date1 - date2datediff(date1,date2)日期相减获取天数2. oracle中decode()函数,可以用case when进行替换例子: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的函数 ROW_NUMBER() OVER(PARTITION BY col1

6、 ORDER BY col2),根据col1分组,在分组内根据col2排序,改函数计算的值就表示每组内部排序后的顺序编号。Mysql没有这个函数,可以用mysql的用户变量来实现例子: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这里

7、用到mysql的用户变量。4. oracle的行号ROWNUM,mysql没有这个行号,也需要用用户变量来实现。例子: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是一样的,都是从第一个开始。Mysql是从0开始。6.

8、Oracle的nvl()对应mysql的ifnull()。7. Oracle 中的WMSYS.WM_CONCAT(),列转行函数,以逗号隔开,mysql可以用GROUP_CONCAT()进行替换。8. Oracle的|可以用mysql的+替代,但是mysql在往某列加上字符时应该用concat,例如给表中name字段加上x:update table1 set name=concat(x,name)。1.1移植过程中重点问题1.1.1数据类型差异ORACLE数据库和MYSQL数据库在数据类型方面差异比较大,而且数据类型也是一个数据库存储数据的基础,所以找到数据类型之间的对应是整个系统进行移植的基

9、础。以下给出了ORACLEMYSQL数据类型的对应关系。数值类型:NUMBERDECIMAL,精度刻度都不变注:如果是序列用BIGINT字符串类型:VARCHAR2VARCHAR长度不变。LONGLONGTEXT这里有可能遇到的问题是超过主键key长度的问题,根据实际情况适当修改,如果是TEXT类型也需要指名长度,否则建立key会报错日期类型:DATEDATETIMETIMESTAMP(N)TIMESTAMP1.1.2SQL语法差异SEQUENCE:MYSQL没有ORACLE中的SEQUENCE对象,我们在迁移的时候需要特别注意,一般SEQUENCE有两种用途:1、作为表中自增字段的序列号。2

10、、程序中获得自动编号。MYSQL数据类型中存在AUTO_INCREMENT为自增数据类型。我们可以利用该数据类型变通一下来满足我们现有系统中的SEQUENCE功能。1、对于ORACLE中SEQUENCE作为表的自增列一般是通过与触发器绑定实现的,在MYSQL中我们可以直接利用MYSQL的AUTO_INCREMENT类型来实现。2、ORACLE开发的应用程序中直接SELECTSEQUENCT来获得自动编号,对于这个功能我们也可以利用MYSQL的AUTO_INCREMENT类型来实现。首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值:mysqlSELECTLAST_INSERT_ID(

11、);|LAST_INSERT_ID()|3|1rowinset(0.06sec)我们可以创建一个含有自增列的表,对该表进行INSERT操作后,再利用LAST_INSERT_ID()函数来获得刚刚INSERT的值,也就是相当于ORACLE中的SEQUENCE. NETVAL。也就是INSERT操作+SELECT操作获得一个自动编号。mysqlCREATETABLEMOCHA_BE_SEQUENCE(IDBIGINTNOTNULLPRIMARYKEYAUTO_INCREMENT);QueryOK,0rowsaffected(0.63sec)mysqlINSERTINTOMOCHA_BE_SEQUE

12、NCEVALUES(NULL);QueryOK,1rowaffected(0.09sec)mysqlSELECTLAST_INSERT_ID();|LAST_INSERT_ID()|1|1rowinset(0.05sec)mysqlINSERTINTOMOCHA_BE_SEQUENCEVALUES(NULL);QueryOK,1rowaffected(0.06sec)mysqlSELECTLAST_INSERT_ID();|LAST_INSERT_ID()|2|1rowinset(0.00sec)BLOG:ORACLE和MYSQL都支持二进制大对象,数据类型的名称都是BLOB,在存储方面都是一

13、样的,BLOB列没有字符集,并且排序和比较基于列值字节位数;在开发应用程序时需要注意对两种数据库BLOG类型的操作的差异。视图Mysql视图限制(1)SELECT语句不能包含FROM子句中的子查询。(2)SELECT语句不能引用系统或用户变量。(3)SELECT语句不能引用预处理语句参数。(4)在存储子程序内,定义不能引用子程序参数或局部变量。(5)在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECKTABLE语句。(6)在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。(7)在视图定义中命名的表

14、必须已存在。(8)不能将触发程序与视图关联在一起。我所要迁移的系统中的视图90%用到了子查询,解决方案是首先重新写查询语句,尽量避免子查询,避免不了,就将子查询中的内容,单独create成一个新的视图,然后再建立所需要的视图。例子:Oracle中带子查询的视图:CREATEORREPLACEVIEWMOCHA_IM_ALL_ACCOUNT_VIEWASSELECTUSER_IDASID,USER_NAMEASNAME,CONCAT(CONCAT(CONCAT(NVL(ORG.ORG_CODE,00000001.10000000),.00.),PERSON_POSITION.PERSON_LEV

15、EL),LPAD(PERSON_POSITION.ORG_PERSON_NO,9,0)ASCODE,NVL(ORG.ORG_LEVEL,1)ASREC_LEVEL,PERSONASREC_TYPEFROM(SELECTPERSON.USER_ID,PERSON.USER_NAME,NVL(POSITION.ORG_ID,-1)ASORG_ID,NVL(POSITION.ORG_PERSON_NO,0)ASORG_PERSON_NO,NVL(POSITION.PERSON_LEVEL,64)ASPERSON_LEVELFROMMOCHA_IM_PERSON_POSITIONPOSITION,MO

16、CHA_IM_PERSONPERSONWHEREPERSON.USER_ID=POSITION.USER_ID(+)ANDPERSON.ADMIN_FLAG=0AndPERSON.STATUS=A)PERSON_POSITION,MOCHA_IM_ORG_VIEWORGWHEREPERSON_POSITION.ORG_ID=ORG.ORG_ID(+)UNIONALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.20000000.00.64000000000ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_P

17、ERSONPERSONWHEREPERSON.ADMIN_FLAG=0AndPERSON.STATUS=IUNIONALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.30000000.00.64000000000ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_PERSONWHEREADMIN_FLAG=1ANDSTATUS=AUNIONALLSELECTLPAD(ORG_ID,20,)ASID,ORG_NAMEASNAME,ORG_CODEASCODE,ORG_LEVELASREC_LEVEL,ORGA

18、SREC_TYPEFROMMOCHA_IM_ORG_VIEWUNIONALLSELECT-1ASID,未分派人员ASNAME,00000001.10000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROMDUALUNIONALLSELECT-2ASID,待删除人员ASNAME,00000001.20000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROMDUALUNIONALLSELECT-3ASID,系统管理员ASNAME,00000001.30000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFromD

19、UAL转为mysql:CREATEORREPLACEVIEWPERSON_POSITIONASSELECTPERSON.USER_ID,PERSON.USER_NAME,IFNULL(POSITION.ORG_ID,-1)ASORG_ID,IFNULL(POSITION.ORG_PERSON_NO,0)ASORG_PERSON_NO,IFNULL(POSITION.PERSON_LEVEL,64)ASPERSON_LEVELFROMMOCHA_IM_PERSON_POSITIONPOSITIONLEFTJOINMOCHA_IM_PERSONPERSONONPERSON.USER_ID=POSI

20、TION.USER_IDWHEREPERSON.ADMIN_FLAG=0AndPERSON.STATUS=A;CREATEORREPLACEVIEWMOCHA_IM_ALL_ACCOUNT_VIEWASSELECTUSER_IDASID,USER_NAMEASNAME,CONCAT(CONCAT(CONCAT(IFNULL(ORG.ORG_CODE,00000001.10000000),.00.),PERSON_POSITION.PERSON_LEVEL),LPAD(PERSON_POSITION.ORG_PERSON_NO,9,0)ASCODE,IFNULL(ORG.ORG_LEVEL,1)

21、ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_ORG_VIEWORGLEFTJOINPERSON_POSITIONONPERSON_POSITION.ORG_ID=ORG.ORG_IDUNIONALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.20000000.00.64000000000ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_PERSONPERSONWHEREPERSON.ADMIN_FLAG=0AndPERSON.STATUS=IUNIONALLSELEC

22、TUSER_IDASID,USER_NAMEASNAME,00000001.30000000.00.64000000000ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_PERSONWHEREADMIN_FLAG=1ANDSTATUS=AUNIONALLSELECTLPAD(ORG_ID,20,)ASID,ORG_NAMEASNAME,ORG_CODEASCODE,ORG_LEVELASREC_LEVEL,ORGASREC_TYPEFROMMOCHA_IM_ORG_VIEWUNIONALLSELECT-1ASID,未分派人员ASNAME,000

23、00001.10000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROMDUALUNIONALLSELECT-2ASID,待删除人员ASNAME,00000001.20000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROMDUALUNIONALLSELECT-3ASID,系统管理员ASNAME,00000001.30000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFromDUAL触发器,函数,存储过程语法的区别,难点在于异常处理模块,其他要关注的比如定义游标的语法,mysql控制流程等等。对于触发器来讲

24、对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFOREUPDATE触发程序。但可以有1个BEFOREUPDATE触发程序和1个BEFOREINSERT触发程序,或1个BEFOREUPDATE触发程序和1个AFTERUPDATE触发程序。就是说mysql不支持oracle中createtrigger*beforeinsertorUpdateordeleteon*.此时应该把这个触发器拆分为3个触发器。例子:Oracle下触发器:CREATEORREPLACETRIGGERMOCHA_IM_DUTY_TRGBEFOREINSERTORUPDATEO

25、RDELETEONMOCHA_IM_DUTYFOREACHROWDECLAREbefImgVARCHAR2(2000);afterImgVARCHAR2(2000);actionVARCHAR2(10);action_moduleVARCHAR2(10);info_categoryVARCHAR2(20);BEGINaction_module:=IM;info_category:=duty;befImg:=DUTY_ID|:old.duty_id|DUTY_NAME|:old.duty_name;afterImg:=DUTY_ID|:new.duty_id|DUTY_NAME|:new.dut

26、y_name;IF(:old.duty_idisnull)THENaction:=Insert;befImg:=;INSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(SYSDATE,action,action_module,info_category,befImg,afterImg);ELSIF(:new.duty_idisnull)THENaction:=Delete;afterImg:=;INSERTINTOMOCHA

27、_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(SYSDATE,action,action_module,info_category,befImg,afterImg);ELSEaction:=Update;IF(befImg!=afterImg)THENINSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER

28、_IMAGE)VALUES(SYSDATE,action,action_module,info_category,befImg,afterImg);ENDIF;ENDIF;EXCEPTIONWHENOTHERSthenbefImg:=;end;mysql下:CREATETRIGGERMOCHA_IM_DUTY_TRG_INSERTBEFOREINSERTONMOCHA_IM_DUTYFOREACHROWBEGINDECLAREbefImgVARCHAR(2000);DECLAREafterImgVARCHAR(2000);DECLAREactionVARCHAR(10);DECLAREacti

29、on_moduleVARCHAR(10);DECLAREinfo_categoryVARCHAR(20);DECLAREexitHANDLERFORSQLEXCEPTION,SQLWARNING,NOTFOUNDbeginsetbefImg=;end;setaction_module=IM;setinfo_category=duty;setafterImg=CONCAT(DUTY_ID,new.duty_id,DUTY_NAME,new.duty_name);setaction=Insert;setbefImg=;INSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIME

30、STAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(now(),action,action_module,info_category,befImg,afterImg);end;CREATETRIGGERMOCHA_IM_DUTY_TRG_DELBEFOREDELETEONMOCHA_IM_DUTYFOREACHROWBEGINDECLAREbefImgVARCHAR(2000);DECLAREafterImgVARCHAR(2000);DECLAREactionVARCHAR(10);DECLAREa

31、ction_moduleVARCHAR(10);DECLAREinfo_categoryVARCHAR(20);DECLAREexitHANDLERFORSQLEXCEPTION,SQLWARNING,NOTFOUNDbeginsetbefImg=;end;setaction_module=IM;setinfo_category=duty;setbefImg=CONCAT(DUTY_ID,old.duty_id,DUTY_NAME,old.duty_name);setaction=Delete;setafterImg=;INSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_T

32、IMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(now(),action,action_module,info_category,befImg,afterImg);end;CREATETRIGGERMOCHA_IM_DUTY_TRG_UPDATEBEFOREUPDATEONMOCHA_IM_DUTYFOREACHROWBEGINDECLAREbefImgVARCHAR(2000);DECLAREafterImgVARCHAR(2000);DECLAREactionVARCHAR(10);DE

33、CLAREaction_moduleVARCHAR(10);DECLAREinfo_categoryVARCHAR(20);DECLAREexitHANDLERFORSQLEXCEPTION,SQLWARNING,NOTFOUNDbeginsetbefImg=;end;setaction_module=IM;setinfo_category=duty;setbefImg=CONCAT(DUTY_ID,old.duty_id,DUTY_NAME,old.duty_name);setafterImg=CONCAT(DUTY_ID,new.duty_id,DUTY_NAME,new.duty_nam

34、e);IF(old.duty_idisnull)THENsetaction=Insert;setbefImg=;ELSEIF(new.duty_idisnull)THENsetaction=Delete;setafterImg=;ELSEsetaction=Update;IF(befImg!=afterImg)THENINSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(now(),action,action_module,

35、info_category,befImg,afterImg);ENDIF;ENDIF;end;在声过程和函数时注意过程支持inout参数函数不支持,mysql下函数是returnsOracle下过程:createorreplaceprocedureMOCHA_FE_OPEN_DOC_SP(v_sqlVARCHAR2)ISbeginexecuteimmediateinsertintoMOCHA_FE_DOC_BODY_TEMP|v_sql;endMOCHA_FE_OPEN_DOC_SP;Mysql下:createprocedureMOCHA_FE_OPEN_DOC_SP(v_sqlVARCHAR

36、(200)beginsetsqltext=CONCAT(insertintoMOCHA_FE_DOC_BODY_TEMP,v_sql);preparestmtfromsqltext;executestmt;end;Oracle下函数:CREATEORREPLACEFUNCTIONGET_PER_NAME_LEVEL(v_UserIdVARCHAR2)RETURNVARCHAR2ISv_UserNameVARCHAR2(30);v_PrimaryPositionVARCHAR2(1);v_PersonLevelVARCHAR2(2);v_LevelNameVARCHAR2(4000);v_Res

37、ultVARCHAR2(4000);v_RecCountNUMBER;CURSORc_PersonPositionISSELECTPERSON.USER_NAME,POSITION.PERSON_LEVEL,POSITION.PRIMARY_POSITION,PERSON_LEVEL.LEVEL_NAMEFROMMOCHA_IM_PERSONPERSON,MOCHA_IM_PERSON_POSITIONPOSITION,MOCHA_IM_PERSON_LEVELPERSON_LEVELWHEREPERSON.USER_ID=POSITION.USER_IDANDPOSITION.PERSON_

38、LEVEL=PERSON_LEVEL.PERSON_LEVELANDPOSITION.USER_ID=v_UserIdORDERBYPOSITION.PRIMARY_POSITIONDESC;BEGINSELECTCOUNT(PERSON_LEVEL)INTOv_RecCountFROMMOCHA_IM_PERSON_POSITIONPOSITIONWHEREUSER_ID=v_UserId;IFv_RecCount=0THENSELECTUSER_NAMEINTOv_ResultFROMMOCHA_IM_PERSONPERSONWHEREUSER_ID=v_UserId;ELSEOPENc_

39、PersonPosition;LOOPFETCHc_PersonPositionINTOv_UserName,v_PersonLevel,v_PrimaryPosition,v_LevelName;EXITWHENc_PersonPosition%NOTFOUND;v_Result:=NVL(v_Result,CONCAT(CONCAT(v_Result,v_UserName),);IF(v_PrimaryPosition=1AND(v_RecCount1ORSUBSTR(v_PersonLevel,2)0ANDv_PrimaryPosition=0)THENv_Result:=CONCAT(

40、CONCAT(v_Result,兼),v_LevelName);ENDIF;ENDLOOP;CLOSEc_PersonPosition;IFLENGTH(v_Result)0THENv_Result:=CONCAT(v_Result,);ENDIF;IFSUBSTR(v_Result,LENGTH(v_Result)-1)=THENv_Result:=SUBSTR(v_Result,1,LENGTH(v_Result)-2);ENDIF;ENDIF;RETURNv_Result;END;Mysql下函数:CREATEFUNCTIONGET_PER_NAME_LEVEL(v_UserIdVARC

41、HAR(30)RETURNSVARCHAR(30)BEGINDECLAREv_UserNameVARCHAR(30);DECLAREv_PrimaryPositionVARCHAR(1);DECLAREv_PersonLevelVARCHAR(2);DECLAREv_LevelNameVARCHAR(4000);DECLAREv_ResultVARCHAR(4000);DECLAREv_RecCountDECIMAL;DECLAREc_PersonPositionCURSORFORSELECTPERSON.USER_NAME,POSITION.PERSON_LEVEL,POSITION.PRI

42、MARY_POSITION,PERSON_LEVEL.LEVEL_NAMEFROMMOCHA_IM_PERSONPERSON,MOCHA_IM_PERSON_POSITIONPOSITION,MOCHA_IM_PERSON_LEVELPERSON_LEVELWHEREPERSON.USER_ID=POSITION.USER_IDANDPOSITION.PERSON_LEVEL=PERSON_LEVEL.PERSON_LEVELANDPOSITION.USER_ID=v_UserIdORDERBYPOSITION.PRIMARY_POSITIONDESC;SELECTCOUNT(PERSON_LEVEL)INTOv_RecCountFROMMOCHA_IM_PERSON_POSITIONPOSITIONWHEREUSER_ID=v_UserId;IFv_RecCount=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com