版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-. z.Oracle到mysql转换的问题总结常用字段类型区别oraclemysqlnumber10,0intnumber10,2decimal10,2varchar2varchardatedatetimeColbte*t个别语句写法区别oracle里只可以用单引号包起字符串,mysql里可以用双引号和单引号。mysql 在select * from () .,from后面是一个结果集时,括号后面必须加上别名。mysql在delete数据时不能给表加别名,如:delete from table1 T where.,会报错,但是可以这样写:delete T from table1 T wher
2、e.。Mysql不支持在同一个表中先查这个表在更新这个表,举个例子说明一下, insert into table1 values字段1,select 字段2 from table1 where., 但是可以在后面那个table1加上别名就没有问题了。insert into table1 values字段1,select T.字段2 from table1 T where.MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。也可以自定义函数实现oracle的ne*t
3、val。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,yyyy-MM-dd hh24:mi:ss)str_to_date(str,%Y-%m-%d %H:%i:%s)注意时间格式to_date(str,yyy
4、y-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)日期增加n个月select date_add(sysdate(),INTERVAL 2 MONTH);date1 - date2datediff(d
5、ate1,date2)日期相减获取天数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 table1oracle的函数 ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2),根据col1分组,在分组根据col2排序,改函数计算的值就表示每组部排序后的顺序编号。Mysql没有这个函数,可以用mysql的用户
6、变量来实现例子: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的用户变量。oracle的行号ROWNUM,mysql没有这个行号,也需要用用户变量来实现。例子:Oracle:select * from table1
7、where rownum - col1=0Mysql: select * from table1,(SELECT (rowNum := 0) HH where (rowNum := rowNum + 1) - col1=0Oracle 中的 substr hello,a,b mysql中是substringhello,a,b oracle的a=0和a=1是一样的,都是从第一个开场。Mysql是从0开场。Oracle的nvl()对应mysql的ifnull()。Oracle 中的WMSYS.WM_CONCAT,列转行函数,以逗号隔开,mysql可以用GROUP_CONCAT()进展替换。Orac
8、le的|可以用mysql的+替代,但是mysql在往*列加上字符时应该用concat,例如给表中name字段加上*:update table1 set name=concat*,name。1.1移植过程中重点问题1.1.1数据类型差异ORACLE数据库和MYSQL数据库在数据类型方面差异比拟大,而且数据类型也是一个数据库存储数据的根底,所以找到数据类型之间的对应是整个系统进展移植的根底。以下给出了ORACLEMYSQL数据类型的对应关系。数值类型:NUMBERDECIMAL,精度刻度都不变注:如果是序列用BIGINT字符串类型:VARCHAR2VARCHAR长度不变。LONGLONGTE*T这
9、里有可能遇到的问题是超过主键key长度的问题,根据实际情况适当修改,如果是TE*T类型也需要指名长度,否则建立key会报错日期类型:DATEDATETIMETIMESTAMP(N)TIMESTAMP1.1.2SQL语法差异SEQUENCE:MYSQL没有ORACLE中的SEQUENCE对象,我们在迁移的时候需要特别注意,一般SEQUENCE有两种用途:1、作为表中自增字段的序列号。2、程序中获得自动编号。MYSQL数据类型中存在AUTO_INCREMENT为自增数据类型。我们可以利用该数据类型变通一下来满足我们现有系统中的SEQUENCE功能。1、对于ORACLE中SEQUENCE作为表的自增
10、列一般是通过与触发器绑定实现的,在MYSQL中我们可以直接利用MYSQL的AUTO_INCREMENT类型来实现。2、ORACLE开发的应用程序中直接SELECTSEQUENCT来获得自动编号,对于这个功能我们也可以利用MYSQL的AUTO_INCREMENT类型来实现。首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值:mysqlSELECTLAST_INSERT_ID();+-+|LAST_INSERT_ID()|+-+|3|+-+1rowinset(0.06sec)我们可以创立一个含有自增列的表,对该表进展INSERT操作后,再利用LAST_INSERT_ID()函数来获得刚刚
11、INSERT的值,也就是相当于ORACLE中的SEQUENCE. NETVAL。也就是INSERT操作+SELECT操作获得一个自动编号。mysqlCREATETABLEMOCHA_BE_SEQUENCE(IDBIGINTNOTNULLPRIMARYKEYAUTO_INCREMENT);QueryOK,0rowsaffected(0.63sec)mysqlINSERTINTOMOCHA_BE_SEQUENCEVALUES(NULL);QueryOK,1rowaffected(0.09sec)mysqlSELECTLAST_INSERT_ID();+-+|LAST_INSERT_ID()|+-+
12、|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,在存储方面都是一样的,BLOB列没有字符集,并且排序和比拟基于列值字节位数;在开发应用程序时需要注意对两种数据库BLOG类型的操作的差异。视图Mysql视图限制1SELE
13、CT语句不能包含FROM子句中的子查询。2SELECT语句不能引用系统或用户变量。3SELECT语句不能引用预处理语句参数。4在存储子程序,定义不能引用子程序参数或局部变量。5在定义中引用的表或视图必须存在。但是,创立了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECKTABLE语句。6在定义中不能引用TEMPORARY表,不能创立TEMPORARY视图。7在视图定义中命名的表必须已存在。8不能将触发程序与视图关联在一起。我所要迁移的系统中的视图90%用到了子查询,解决方案是首先重新写查询语句,尽量防止子查询,防止不了,就将子查询中的容,单独create成一
14、个新的视图,然后再建立所需要的视图。例子:Oracle中带子查询的视图:CREATEORREPLACEVIEWMOCHA_IM_ALL_ACCOUNT_VIEWASSELECTUSER_IDASID,USER_NAMEASNAME,CONCAT(CONCAT(CONCAT(NVL(ORG.ORG_CODE,00000001.10000000),.00.),PERSON_POSITION.PERSON_LEVEL),LPAD(PERSON_POSITION.ORG_PERSON_NO,9,0)ASCODE,NVL(ORG.ORG_LEVEL,1)ASREC_LEVEL,PERSONASREC_T
15、YPEFROM(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,MOCHA_IM_PERSONPERSONWHEREPERSON.USER_ID=POSITION.USER_ID(+)ANDPERSON.ADMIN_FLAG=0AndPERSON.STATU
16、S=A)PERSON_POSITION,MOCHA_IM_ORG_VIEWORGWHEREPERSON_POSITION.ORG_ID=ORG.ORG_ID(+)UNIONALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.20000000.00.ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_PERSONPERSONWHEREPERSON.ADMIN_FLAG=0AndPERSON.STATUS=IUNIONALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.30
17、000000.00.ASCODE,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,00000001.10000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROM
18、DUALUNIONALLSELECT-2ASID,待删除人员ASNAME,00000001.20000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROMDUALUNIONALLSELECT-3ASID,系统管理员ASNAME,00000001.30000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFromDUAL/转为mysql:CREATEORREPLACEVIEWPERSON_POSITIONASSELECTPERSON.USER_ID,PERSON.USER_NAME,IFNULL(POSITION.ORG_ID,-1)ASORG
19、_ID,IFNULL(POSITION.ORG_PERSON_NO,0)ASORG_PERSON_NO,IFNULL(POSITION.PERSON_LEVEL,64)ASPERSON_LEVELFROMMOCHA_IM_PERSON_POSITIONPOSITIONLEFTJOINMOCHA_IM_PERSONPERSONONPERSON.USER_ID=POSITION.USER_IDWHEREPERSON.ADMIN_FLAG=0AndPERSON.STATUS=A;/CREATEORREPLACEVIEWMOCHA_IM_ALL_ACCOUNT_VIEWASSELECTUSER_IDA
20、SID,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)ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_ORG_VIEWORGLEFTJOINPERSON_POSITIONONPERSON_POSITION.ORG_ID=ORG.ORG_IDUNION
21、ALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.20000000.00.ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_PERSONPERSONWHEREPERSON.ADMIN_FLAG=0AndPERSON.STATUS=IUNIONALLSELECTUSER_IDASID,USER_NAMEASNAME,00000001.30000000.00.ASCODE,1ASREC_LEVEL,PERSONASREC_TYPEFROMMOCHA_IM_PERSONWHEREADMIN_FLAG=1ANDS
22、TATUS=AUNIONALLSELECTLPAD(ORG_ID,20,)ASID,ORG_NAMEASNAME,ORG_CODEASCODE,ORG_LEVELASREC_LEVEL,ORGASREC_TYPEFROMMOCHA_IM_ORG_VIEWUNIONALLSELECT-1ASID,未分派人员ASNAME,00000001.10000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFROMDUALUNIONALLSELECT-2ASID,待删除人员ASNAME,00000001.20000000ASCODE,1ASREC_LEVEL,ORGASREC_TYP
23、EFROMDUALUNIONALLSELECT-3ASID,系统管理员ASNAME,00000001.30000000ASCODE,1ASREC_LEVEL,ORGASREC_TYPEFromDUAL/触发器,函数,存储过程语法的区别,难点在于异常处理模块,其他要关注的比方定义游标的语法,mysql控制流程等等。对于触发器来讲对于具有一样触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于*一表,不能有两个BEFOREUPDATE触发程序。但可以有1个BEFOREUPDATE触发程序和1个BEFOREINSERT触发程序,或1个BEFOREUPDATE触发程序和1个AFTERUPDA
24、TE触发程序。就是说mysql不支持oracle中createtrigger*beforeinsertorUpdateordeleteon*.此时应该把这个触发器拆分为3个触发器。例子:Oracle下触发器:CREATEORREPLACETRIGGERMOCHA_IM_DUTY_TRGBEFOREINSERTORUPDATEORDELETEONMOCHA_IM_DUTYFOREACHROWDECLAREbefImgVARCHAR2(2000);afterImgVARCHAR2(2000);actionVARCHAR2(10);action_moduleVARCHAR2(10);info_cat
25、egoryVARCHAR2(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.duty_name;IF(:old.duty_idisnull)THENaction:=Insert;befImg:=;INSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGOR
26、Y,BEFORE_IMAGE,AFTER_IMAGE)VALUES(SYSDATE,action,action_module,info_category,befImg,afterImg);ELSIF(:new.duty_idisnull)THENaction:=Delete;afterImg:=;INSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(SYSDATE,action,action_module,info_cate
27、gory,befImg,afterImg);ELSEaction:=Update;IF(befImg!=afterImg)THENINSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(SYSDATE,action,action_module,info_category,befImg,afterImg);ENDIF;ENDIF;E*CEPTIONWHENOTHERSthenbefImg:=;end;/mysql下:CREATE
28、TRIGGERMOCHA_IM_DUTY_TRG_INSERTBEFOREINSERTONMOCHA_IM_DUTYFOREACHROWBEGINDECLAREbefImgVARCHAR(2000);DECLAREafterImgVARCHAR(2000);DECLAREactionVARCHAR(10);DECLAREaction_moduleVARCHAR(10);DECLAREinfo_categoryVARCHAR(20);DECLAREe*itHANDLERFORSQLE*CEPTION,SQLWARNING,NOTFOUNDbeginsetbefImg=;end;setaction
29、_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_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(now(),action,action_module,info_category,befImg,afterImg);end;
30、/CREATETRIGGERMOCHA_IM_DUTY_TRG_DELBEFOREDELETEONMOCHA_IM_DUTYFOREACHROWBEGINDECLAREbefImgVARCHAR(2000);DECLAREafterImgVARCHAR(2000);DECLAREactionVARCHAR(10);DECLAREaction_moduleVARCHAR(10);DECLAREinfo_categoryVARCHAR(20);DECLAREe*itHANDLERFORSQLE*CEPTION,SQLWARNING,NOTFOUNDbeginsetbefImg=;end;setac
31、tion_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_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(now(),action,action_module,info_category,befImg,afterImg);
32、end;/CREATETRIGGERMOCHA_IM_DUTY_TRG_UPDATEBEFOREUPDATEONMOCHA_IM_DUTYFOREACHROWBEGINDECLAREbefImgVARCHAR(2000);DECLAREafterImgVARCHAR(2000);DECLAREactionVARCHAR(10);DECLAREaction_moduleVARCHAR(10);DECLAREinfo_categoryVARCHAR(20);DECLAREe*itHANDLERFORSQLE*CEPTION,SQLWARNING,NOTFOUNDbeginsetbefImg=;en
33、d;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_name);IF(old.duty_idisnull)THENsetaction=Insert;setbefImg=;ELSEIF(new.duty_idisnull)THENsetaction=Delete;setafterImg=;ELSEsetaction=Upda
34、te;IF(befImg!=afterImg)THENINSERTINTOMOCHA_IM_AUDIT_LOG(ACTION_TIMESTAMP,ACTION,ACTION_MODULE,INFO_CATEGORY,BEFORE_IMAGE,AFTER_IMAGE)VALUES(now(),action,action_module,info_category,befImg,afterImg);ENDIF;ENDIF;end;/在声过程和函数时注意过程支持inout参数函数不支持,mysql下函数是returnsOracle下过程:createorreplaceprocedureMOCHA_FE
35、_OPEN_DOC_SP(v_sqlVARCHAR2)ISbegine*ecuteimmediateinsertintoMOCHA_FE_DOC_BODY_TEMP|v_sql;endMOCHA_FE_OPEN_DOC_SP;/Mysql下:createprocedureMOCHA_FE_OPEN_DOC_SP(v_sqlVARCHAR(200)beginsetsqlte*t=CONCAT(insertintoMOCHA_FE_DOC_BODY_TEMP,v_sql);preparestmtfromsqlte*t;e*ecutestmt;end;/Oracle下函数:CREATEORREPLA
36、CEFUNCTIONGET_PER_NAME_LEVEL(v_UserIdVARCHAR2)RETURNVARCHAR2ISv_UserNameVARCHAR2(30);v_PrimaryPositionVARCHAR2(1);v_PersonLevelVARCHAR2(2);v_LevelNameVARCHAR2(4000);v_ResultVARCHAR2(4000);v_RecCountNUMBER;CURSORc_PersonPositionISSELECTPERSON.USER_NAME,POSITION.PERSON_LEVEL,POSITION.PRIMARY_POSITION,
37、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;BEGINSELECTCOUNT(PERSON_LEVEL)INTO
38、v_RecCountFROMMOCHA_IM_PERSON_POSITIONPOSITIONWHEREUSER_ID=v_UserId;IFv_RecCount=0THENSELECTUSER_NAMEINTOv_ResultFROMMOCHA_IM_PERSONPERSONWHEREUSER_ID=v_UserId;ELSEOPENc_PersonPosition;LOOPFETCHc_PersonPositionINTOv_UserName,v_PersonLevel,v_PrimaryPosition,v_LevelName;E*ITWHENc_PersonPosition%NOTFOU
39、ND;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(CONCAT(v_Result,兼),v_LevelName);ENDIF;ENDLOOP;CLOSEc_PersonPosition;IFLENGTH(v_Result)0THENv_Result:=CONCAT(v_Result,);ENDIF;IFSUB
40、STR(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_UserIdVARCHAR(30)RETURNSVARCHAR(30)BEGINDECLAREv_UserNameVARCHAR(30);DECLAREv_PrimaryPositionVARCHAR(1);DECLAREv_PersonLevelVARCHAR(2);DECLA
41、REv_LevelNameVARCHAR(4000);DECLAREv_ResultVARCHAR(4000);DECLAREv_RecCountDECIMAL;DECLAREc_PersonPositionCURSORFORSELECTPERSON.USER_NAME,POSITION.PERSON_LEVEL,POSITION.PRIMARY_POSITION,PERSON_LEVEL.LEVEL_NAMEFROMMOCHA_IM_PERSONPERSON,MOCHA_IM_PERSON_POSITIONPOSITION,MOCHA_IM_PERSON_LEVELPERSON_LEVELW
42、HEREPERSON.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=0THENSELECTUSER_NAMEINTOv_ResultFROMMOCH
43、A_IM_PERSONPERSONWHEREUSER_ID=v_UserId;ELSEOPENc_PersonPosition;REPEATFETCHc_PersonPositionINTOv_UserName,v_PersonLevel,v_PrimaryPosition,v_LevelName;IFNOTdoneTHENsetv_Result=IFNULL(v_Result,CONCAT(CONCAT(v_Result,v_UserName),);IF(v_PrimaryPosition=1AND(v_RecCount1ORSUBSTR(v_PersonLevel,2)0ANDv_Prim
44、aryPosition=0)THENsetv_Result=CONCAT(CONCAT(v_Result,兼),v_LevelName);ENDIF;ENDIF;UNTILdoneENDREPEAT;CLOSEc_PersonPosition;IFLENGTH(v_Result)0THENsetv_Result=CONCAT(v_Result,);ENDIF;IFSUBSTR(v_Result,LENGTH(v_Result)-1)=THENsetv_Result=SUBSTR(v_Result,1,LENGTH(v_Result)-2);ENDIF;ENDIF;RETURNv_Result;
45、END;/索引普通索引,唯一索引,全文索引都支持,但是不支持bitmap索引。其他:Oracle用|连接字符串,mysql不支持|,但可以用CONCAT来连接,nvl在mysql中是ifnull,instr函数oracle与mysql有些不同,oracle支持的参数比mysql多,功能更强大,但是mysql有substring_inde*配合substring,length可以做绝大多数的字符的操作为了支持中文,字符集选择utf8,为了支持事务和行级锁选择存储引擎为InnoDB这些可以在mysql的配置文件里去改,也可以在建表的时候写进sql中最后mysql与oracle的语法临时表,表的me
46、nt,定义变量啊等等函数上的区别还有很多。MySQL转换Oracle的七大考前须知有很多应用工程, 刚起步的时候用MySQL数据库根本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MySQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有MySQL转换Oracle的需求,应用程序也要相应做一些修改。下面总结出MySQL转换Oracle的几点考前须知,希望对大家有所帮助。1自动增长的数据类型处理MySQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。CRE
47、ATE SEQUENCE 序列号的名称 (最好是表名 序列号标记) INCREMENT BY 1 START WITH 1 MA*VALUE 99999 CYCLE NOCACHE;其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999 INSERT 语句插入这个字段值为: 序列号的名称.NE*TVAL2. 单引号的处理MySQL里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。3. 翻页的SQL语句的处理MySQL处理翻页的SQL语句比拟简单,用L
48、IMIT 开场位置, 记录个数;PHP里还可以用SEEK定位到结果集的位置。Oracle处理翻页的SQL语句就比拟繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUMlt;100, 不能用ROWNUM80。 以下是经过分析后较好的两种Oracle翻页SQL语句( ID是唯一关键字的字段名 ):语句一:SELECTID,FIELD_NAME,.FROMTABLE_NAMEWHERE IDIN(SELECTIDFROM(SELECTROWNUMASNUMROW, IDFROMTABLE_NAMEWHERE条件1ORDERBY条件2) WHERENUMROW80ANDNU
49、MROWlt;100)ORDERBY条件3;语句二:SELECT*FROM(SELECTROWNUMASNUMROW, c.*from(selectFIELD_NAME,. FROMTABLE_NAMEWHERE条件1ORDERBY条件2)c) WHERENUMROW80ANDNUMROWlt;100)ORDERBY条件3;4 长字符串的处理长字符串的处理Oracle也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于 4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用Oracle里自带的DBMS_LOB程序包。插入修改记录前一定要做进展非
50、空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告, 返回上次操作。5. 日期字段的处理MySQL日期字段分DATE和TIME两种,Oracle日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE, 准确到秒,或者用字符串转换成日期型函数TO_DATE(2001-08-01,YYYY-MM-DD) 年-月-日 24小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS TO_DATE()日期型字段转换成字符串函数TO_CHAR(2001-08-01,YYYY-MM-DD HH24:MI:SS) 日期字段的数学运算公式有很大的不同。MySQL找到
51、离当前时间7天用 DATE_FIELD_NAME SUBDATENOW,INTERVAL 7 DAYOracle找到离当前时间7天用 DATE_FIELD_NAME SYSDATE - 7;6. 空字符的处理MySQL的非空字段也有空的容,Oracle里定义了非空字段就不容许有空的容。 按MySQL的NOT NULL来定义Oracle表构造, 导数据的时候会产生错误。因此导数据时要对空字符进展判断,如果为NULL或空字符,需要把它改成一个空格的字符串。7. 字符串的模糊比拟MySQL里用 字段名 likeOracle里也可以用 字段名 like 但这种方法不能使用索引, 速度不快用字符串比拟函
52、数 instr(字段名,字符串)0 会得到更准确的查找结果 8. 程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。以上MySQL转换Oracle的相关考前须知,供您参考。序列处理MySQL自增长与Oracle序列的区别: 自增长只能用于表中的其中一个字段 自增长只能被分配给固定表的固定的*一字段,不能被多个表共用. 自增长会把一个未指定或NULL值的字段自动填上.摘自:ronaldbradford./blog/sequences-in-mysql-2006-01-26/经过初步测试,需要进展大数据量的测试在mysql中实现:NE*TVAL(sequence);CURRVAL(se
53、quence);SETVAL(sequence,value);currvalDROP TABLE IF E*ISTS sequence;CREATE TABLE sequence (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 1,PRIMARY KEY (name);INSERT INTO sequence VALUES (MovieSeq,3,5);DROP FUNCTION IF E*ISTS currval;DELIMITER $CREATE FUNCTION cu
54、rrval (seq_name VARCHAR(50)RETURNS INTEGERCONTAINS SQLBEGIN DECLARE value INTEGER; SET value = 0; SELECT current_value INTO value FROM sequence WHERE name = seq_name; RETURN value;END$DELIMITER ;mysql INSERT INTO sequence VALUES (MovieSeq,3,5);Query OK, 1 row affected (0.00 sec)mysql select currval(
55、MovieSeq);+-+| currval(MovieSeq) |+-+| 3 |+-+1 row in set (0.00 sec)mysql INSERT INTO sequence VALUES (wang*jd,3,5);Query OK, 1 row affected (0.00 sec)mysql select * from sequence;+-+-+-+| name | current_value | increment |+-+-+-+| MovieSeq | 3 | 5 | wang*jd | 3 | 5 |+-+-+-+2 rows in set (0.00 sec)n
56、e*tvalDROP FUNCTION IF E*ISTS ne*tval;DELIMITER $CREATE FUNCTION ne*tval (seq_name VARCHAR(50)RETURNS INTEGERCONTAINS SQLBEGIN UPDATE sequence SET current_value = current_value + increment WHERE name = seq_name; RETURN currval(seq_name);END$DELIMITER ;mysql select ne*tval(MovieSeq);+-+| ne*tval(Movi
57、eSeq) |+-+| 8 |+-+1 row in set (0.00 sec)mysql select ne*tval(wang*jd);+-+| ne*tval(wang*jd) |+-+| 8 |+-+1 row in set (0.00 sec)mysql select ne*tval(wang*jd);+-+| ne*tval(wang*jd) |+-+| 13 |+-+1 row in set (0.00 sec)setvalDROP FUNCTION IF E*ISTS setval;DELIMITER $CREATE FUNCTION setval (seq_name VAR
58、CHAR(50), value INTEGER)RETURNS INTEGERCONTAINS SQLBEGIN UPDATE sequence SET current_value = value WHERE name = seq_name; RETURN currval(seq_name);END$DELIMITER ;mysql select setval(wang*jd,500);+-+| setval(wang*jd,500) |+-+| 500 |+-+1 row in set (0.00 sec)mysql select * from sequence;+-+-+-+| name
59、| current_value | increment |+-+-+-+| MovieSeq | 8 | 5 | wang*jd | 500 | 5 |+-+-+-+2 rows in set (0.00 sec)个人理解:对表sequence中column name的取值可以定义到静态文件中,在表sequence中插入一条数据后,执行INSERT INTO sequence VALUES (wang*jd,3,5) 对序列进展初步赋值。.两外一条主机获取值为2,4,6,8,10防止重复。Namecurrent_valueincrementSeq0010Seq1110Seq2210Seq331
60、0Seq4410Seq5510Seq6610Seq7710Seq8810Seq9910Mysql中文乱码问题完美解决方案总结: 在建立database、create table和insert语句时候,使用统一的编码UTF8.-创立数据库mysql create database asd character set utf8 collate utf8_general_ci;Query OK, 1 row affected (0.00 sec)-建表:create table TD_PTL_LOVEMUSIC( ID INT not null, BILLBOARDNAME VARCHAR(100)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学大四(水利水电工程)水利枢纽综合测试试题及答案
- 制造业安全环保培训
- 工程建设廉政培训课件
- 临床营养专业医疗质量控制指标(2022年版)学习课件
- 手术应激反应的决策干预策略
- 2026年安全生产隐患排查治理知识自测题库及答案
- 2026年生态环保知识竞赛试题库及答案
- 2026年河南“安全生产月”知识竞赛试题及答案
- 成本效益分析与资源配置
- 慢阻肺远程数字疗法的依从性优化策略
- 2025榆林市旅游投资集团有限公司招聘(15人)参考笔试题库及答案解析
- 2025福建三明市总工会三明市工人文化宫招聘工作人1人参考题库带答案解析
- 【人卫课件耳鼻喉9版】鼻科学第一章 鼻的应用解剖学及生理学
- 抵押车过户协议书
- 葡萄种植课件
- 浅析我国政府雇员制的利弊及发展对策研究
- 2025年全国高校辅导员国赛大赛基础知识测试题(附答案)(三套)
- 粉丝群体特征分析-洞察与解读
- 2025年亚氨基二乙酸行业分析报告及未来发展趋势预测
- 2025年江苏省普通高中高二上学期学业水平合格性考试调研历史试题(解析版)
- 学堂在线 雨课堂 学堂云 批判性思维-方法和实践 章节测试答案
评论
0/150
提交评论