oracle到mysql转换的问题总结_第1页
oracle到mysql转换的问题总结_第2页
oracle到mysql转换的问题总结_第3页
oracle到mysql转换的问题总结_第4页
oracle到mysql转换的问题总结_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle 到 mysql 转换的问题总结 常用字段类型区别 oracle mysql number(10,0) int number(10,2) decimal(10,2) varchar2 varchar date datetime Colb text 个别语句写法区别 1.oracle里只可以用单引号包起字符串,mysql 里可以用双引号和单引号。 2.mysql 在 select * from () ,from 后面是一个结果集时,括号后面必 须加上别名。 3.mysql在 delete数据时不能给表加别名,如:delete 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有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数 据值。ORACLE 没有自动增长的数据类型,需要建立一个自动增长的序列号,插 入记录时要把序列号的下一个值赋于此字段。也可以自定义函数实现 oracle 的 nextval。 6.翻页的 sql语句处理,MYSQL 处理翻页的 SQL语句比较简单,用 LIMIT 开始 位置, 记录个数,例如:select * from table limit m,n,意思是从 m+1开始 取 n条。 常见的函数替换 1.日期转换方面的函数 oracle mysql 说明 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,yyyy-MM-dd hh24:mi:ss) str_to_date(str,%Y-%m- %d%T) 注意时间格式 to_char()、to_number() convert(字段名,类型) 类型转换 date + n date_add(date,interval n day) 日期增加 n 天 select date_add(sysdate(),INTER VAL 2 DAY); add_months(date,n) date_add(date,interval n month) 日期增加 n 个月 select date_add(sysdate(),INTER VAL 2 MONTH); date1 - date2 datediff(date1,date2) 日期相减获取天数 2.oracle 中 decode()函数,可以用 case when 进行替换 例子: Oracle:select decode(a,b,c,d) as col1 from table1; Mysql:select case when a=b then c when a!=b then d end as col1 from table1 3.oracle 的函数 ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2), 根据 col1 分组,在分组内根据 col2 排序,改函数计算的值就表示每组内部排序 后的顺序编号。 Mysql 没有这个函数,可以用 mysql 的用户变量来实现 例子: Oracle:select row_number() over(partition by col1 order by col2) as num from table1 Mysql: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.oracle 的行号 ROWNUM,mysql 没有这个行号,也需要用用户变量来实现。 例子: Oracle:select * from table1 where rownum - col1=0 Mysql: select * from table1,(SELECT (rowNum := 0) HH where (rowNum := rowNum + 1) - col1=0 5.Oracle 中的 substr (hello,a,b) mysql中是 substring(hello,a,b) oracle的 a=0和 a=1是一样的,都是从第一 个开始。Mysql 是从 0开始。 6.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 数据库在数据类型方面差异比较大,而且数据类型也是 一个数据库存储数据的基础,所以找到数据类型之间的对应是整个系统进行移植的基础。 以下给出了 ORACLE MYSQL 数据类型的对应关系。 数值类型: NUMBER DECIMAL,精度刻度都不变 注:如果是序列用 BIGINT 字符串类型: VARCHAR2 VARCHAR 长度不变。 LONG LONGTEXT 这里有可能遇到的问题是超过主键 key 长度的问题,根据实际情况适当修改,如果是 TEXT 类型也需要指名长度,否则建立 key 会报错 日期类型: DATE DATETIME TIMESTAMP(N) TIMESTAMP 1.1.2 SQL 语法差异 SEQUENCE: MYSQL 没有 ORACLE 中的 SEQUENCE 对象,我们在迁移的时候需要特别注意, 一般 SEQUENCE 有两种用途: 1、 作为表中自增字段的序列号。 2、 程序中获得自动编号。 MYSQL 数据类型中存在 AUTO_INCREMENT 为自增数据类型。我们可以利用该数 据类型变通一下来满足我们现有系统中的 SEQUENCE 功能。 1、 对于 ORACLE 中 SEQUENCE 作为表的自增列一般是通过与触发器绑定实现的, 在 MYSQL 中我们可以直接利用 MYSQL 的 AUTO_INCREMENT 类型来实现。 2、 ORACLE 开发的应用程序中直接 SELECT SEQUENCT 来获得自动编号,对于 这个功能我们也可以利用 MYSQL 的 AUTO_INCREMENT 类型来实现。 首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值: mysql SELECT LAST_INSERT_ID(); +-+ | LAST_INSERT_ID() | +-+ | 3 | +-+ 1 row in set (0.06 sec) 我们可以创建一个含有自增列的表,对该表进行 INSERT 操作后,再利用 LAST_INSERT_ID()函数来获得刚刚 INSERT 的值,也就是相当于 ORACLE 中的 SEQUENCE. NETVAL。也就是 INSERT 操作+SELECT 操作获得一个自动编号。 mysql CREATE TABLE MOCHA_BE_SEQUENCE(ID BIGINT NOT NULL PRIMA RY KEY AUTO_INCREM ENT); Query OK, 0 rows affected (0.63 sec) mysql INSERT INTO MOCHA_BE_SEQUENCE VALUES(NULL); Query OK, 1 row affected (0.09 sec) mysql SELECT LAST_INSERT_ID(); +-+ | LAST_INSERT_ID() | +-+ | 1 | +-+ 1 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() | +-+ | 2 | +-+ 1 row in set (0.00 sec) BLOG: ORACLE 和 MYSQL 都支持二进制大对象,数据类型的名称都是 BLOB,在存储方 面都是一样的,BLOB 列没有字符集,并且排序和比较基于列值字节位数;在开发应用程 序时需要注意对两种数据库 BLOG 类型的操作的差异。 视图 Mysql 视图限制(1)SELECT 语句不能包含 FROM 子句中的子查询。 (2)SELECT 语句不能引用系统或用户变量。 (3)SELECT 语句不能引用预处理语句参数。 (4)在存储子程序内,定义不能引用子程序参数或局部变量。 (5)在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用 的表或视图。要想检查视图定义是否存在这类问题,可使用 CHECK TABLE 语句。 (6)在定义中不能引用 TEMPORARY 表,不能创建 TEMPORARY 视图。 (7)在视图定义中命名的表必须已存在。 (8)不能将触发程序与视图关联在一起。 我所要迁移的系统中的视图 90%用到了子查询,解决方案是首先重新写查询语句,尽 量避免子查询,避免不了,就将子查询中的内容,单独 create 成一个新的视图,然后再建 立所需要的视图。 例子: Oracle 中带子查询的视图: CREATE OR REPLACE VIEW MOCHA_IM_ALL_ACCOUNT_VIEW AS SELECT USER_ID AS ID, USER_NAME AS NAME, CONCAT(CONCAT(CONCAT( NVL(ORG.ORG_CODE,00000001.10000000), .00.), PERSON_POSITION.PERSON_L EVEL), LPAD(PERSON_POSITION.ORG_PERSON_NO,9,0) AS CODE, NVL(ORG.O RG_LEVEL, 1) AS REC_LEVEL, PERSON AS REC_TYPE FROM (SELECT PERSON.USER_ID , PERSON.USER_NAME, NVL(POSITION.O 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_ID = POSITION.USER_ID (+) AND PERSON.ADMIN_FLAG = 0 And PERSON.STATUS=A) PERSON_POSITION, MOCHA_IM_ORG_VIEW ORG WHERE PERSON_POSITION.ORG_ID = ORG.ORG_ID (+) UNION ALL SELECT USER_ID AS ID, USER_NAME AS NAME, 00000001.20000000.00.6400 0000000 AS CODE, 1 AS REC_LEVEL, PERSON AS REC_TYPE FROM MOCHA_IM_PERSON PERSON WHERE PERSON.ADMIN_FLAG = 0 And PERSON.STATUS=I UNION ALL SELECT USER_ID AS ID, USER_NAME AS NAME, 00000001.30000000.00.6400 0000000 AS CODE ,1 AS REC_LEVEL, PERSON AS REC_TYPE FROM MOCHA_IM_PERSON WHERE ADMIN_FLAG = 1 AND STATUS=A UNION ALL SELECT LPAD(ORG_ID,20, ) AS ID, ORG_NAME AS NAME, ORG_CODE AS CO DE,ORG_LEVEL AS REC_LEVEL, ORG AS REC_TYPE FROM MOCHA_IM_ORG_VI EW UNION ALL SELECT -1 AS ID, 未分派人员 AS NAME, 00000001.10000000 AS CODE, 1 AS REC_LEVEL, ORG AS REC_TYPE FROM DUAL UNION ALL SELECT -2 AS ID, 待删除人员 AS NAME, 00000001.20000000 AS CODE, 1 AS REC_LEVEL, ORG AS REC_TYPE FROM DUAL UNION ALL SELECT -3 AS ID, 系统管理员 AS NAME, 00000001.30000000 AS CODE, 1 AS REC_LEVEL, ORG AS REC_TYPE From DUAL / 转为 mysql: CREATE OR REPLACE VIEW PERSON_POSITION AS SELECT PERSON.USER_ID , PERSON.USER_NAME, IFNULL(POSITION.ORG_I D, - 1) AS ORG_ID, IFNULL(POSITION.ORG_PERSON_NO, 0) AS ORG_PERSON_NO, IF NULL(POSITION.PERSON_LEVEL, 64) AS PERSON_LEVEL FROM MOCHA_IM_PERSON_POSITION POSITION LEFT JOIN MOCHA_IM_PE RSON PERSON 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 AS SELECT USER_ID AS ID, USER_NAME AS NAME, CONCAT(CONCAT(CONCAT(IFNULL(ORG.ORG_CODE,00000001.10000000), . 00.), PERSON_POSITION.PERSON_LEVEL), LPAD(PERSON_POSITION.ORG_PERS ON_NO,9,0) AS CODE, IFNULL(ORG.ORG_LEVEL, 1) AS REC_LEVEL, PERSON AS REC_TYPE FROM MOCHA_IM_ORG_VIEW ORG LEFT JOIN PERSON_POSITION ON PER SON_POSITION.ORG_ID = ORG.ORG_ID UNION ALL SELECT USER_ID AS ID, USER_NAME AS NAME, 00000001.20000000.00.6400 0000000 AS CODE, 1 AS REC_LEVEL, PERSON AS REC_TYPE FROM MOCHA_IM_PERSON PERSON WHERE PERSON.ADMIN_FLAG = 0 And PERSON.STATUS=I UNION ALL SELECT USER_ID AS ID, USER_NAME AS NAME, 00000001.30000000.00.6400 0000000 AS CODE ,1 AS REC_LEVEL, PERSON AS REC_TYPE FROM MOCHA_IM_PERSON WHERE ADMIN_FLAG = 1 AND STATUS=A UNION ALL SELECT LPAD(ORG_ID,20, ) AS ID, ORG_NAME AS NAME, ORG_CODE AS CO DE,ORG_LEVEL AS REC_LEVEL, ORG AS REC_TYPE FROM MOCHA_IM_ORG_VI EW UNION ALL SELECT -1 AS ID, 未分派人员 AS NAME, 00000001.10000000 AS CODE, 1 AS REC_LEVEL, ORG AS REC_TYPE FROM DUAL UNION ALL SELECT -2 AS ID, 待删除人员 AS NAME, 00000001.20000000 AS CODE, 1 AS REC_LEVEL, ORG AS REC_TYPE FROM DUAL UNION ALL SELECT -3 AS ID, 系统管理员 AS NAME, 00000001.30000000 AS CODE, 1 AS REC_LEVEL, ORG AS REC_TYPE From DUAL / 触发器,函数,存储过程 语法的区别,难点在于异常处理模块,其他要关注的比如定义游标的语法,mysql 控 制流程等等。 对于触发器来讲对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程 序。例如,对于某一表,不能有两个 BEFORE UPDATE 触发程序。但可以有 1 个 BEFORE UPDATE 触发程序和 1 个 BEFORE INSERT 触发程序,或 1 个 BEFORE UPDATE 触发程序和 1 个 AFTER UPDATE 触发程序。就是说 mysql 不支持 oracle 中 create trigger * before insert or Update or delete on *.此时应该把这个触发器拆分为 3 个触发器。 例子: Oracle 下触发器: CREATE OR REPLACE TRIGGER MOCHA_IM_DUTY_TRG BEFORE INSERT OR UPDATE OR DELETE ON MOCHA_IM_DUTY FOR EACH ROW DECLARE befImg VARCHAR2(2000); afterImg VARCHAR2(2000); action VARCHAR2(10); action_module VARCHAR2(10); info_category VARCHAR2(20); BEGIN action_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_id is null) THEN action := Insert; befImg := ; INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTIO N_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (SYSDA TE, action, action_module, info_category, befImg, afterImg); ELSIF (:new.duty_id is null) THEN action := Delete; afterImg := ; INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTIO N_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (SYSDA TE, action, action_module, info_category, befImg, afterImg); ELSE action := Update; IF(befImg != afterImg) THEN INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACT ION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (SYS DATE, action, action_module, info_category, befImg, afterImg); END IF; END IF; EXCEPTION WHEN OTHERS then befImg := ; end; / mysql 下: CREATE TRIGGER MOCHA_IM_DUTY_TRG_INSERT BEFORE INSERT ON MOCHA_IM_DUTY FOR EACH ROW BEGIN DECLARE befImg VARCHAR(2000); DECLARE afterImg VARCHAR(2000); DECLARE action VARCHAR(10); DECLARE action_module VARCHAR(10); DECLARE info_category VARCHAR(20); DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND begin set befImg = ; end; set action_module = IM; set info_category = duty; set afterImg =CONCAT( DUTY_ID , new.duty_id , DUTY_NAME , new.duty_na me); set action = Insert; set befImg = ; INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTIO N_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (now(), a ction, action_module, info_category, befImg, afterImg); end; / CREATE TRIGGER MOCHA_IM_DUTY_TRG_DEL BEFORE DELETE ON MOCHA_IM_DUTY FOR EACH ROW BEGIN DECLARE befImg VARCHAR(2000); DECLARE afterImg VARCHAR(2000); DECLARE action VARCHAR(10); DECLARE action_module VARCHAR(10); DECLARE info_category VARCHAR(20); DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND begin set befImg = ; end; set action_module = IM; set info_category = duty; set befImg = CONCAT(DUTY_ID , old.duty_id , DUTY_NAME , old.duty_name); set action = Delete; set afterImg = ; INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACTIO N_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (now(), a ction, action_module, info_category, befImg, afterImg); end; / CREATE TRIGGER MOCHA_IM_DUTY_TRG_UPDATE BEFORE UPDATE ON MOCHA_IM_DUTY FOR EACH ROW BEGIN DECLARE befImg VARCHAR(2000); DECLARE afterImg VARCHAR(2000); DECLARE action VARCHAR(10); DECLARE action_module VARCHAR(10); DECLARE info_category VARCHAR(20); DECLARE exit HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND begin set befImg = ; end; set action_module = IM; set 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 , new.duty_na me); IF (old.duty_id is null) THEN set action = Insert; set befImg = ; ELSEIF (new.duty_id is null) THEN set action = Delete; set afterImg = ; ELSE set action = Update; IF(befImg != afterImg) THEN INSERT INTO MOCHA_IM_AUDIT_LOG (ACTION_TIMESTAMP, ACTION, ACT ION_MODULE, INFO_CATEGORY, BEFORE_IMAGE, AFTER_IMAGE) VALUES (now(), action, action_module, info_category, befImg, afterImg); END IF; END IF; end; / 在声过程和函数时注意过程支持 inout 参数函数不支持, mysql 下函数是 returns Oracle 下过程: create or replace procedure MOCHA_FE_OPEN_DOC_SP(v_sql VARCHAR2) IS begin execute immediate 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) begin set sqltext=CONCAT( insert into MOCHA_FE_DOC_BODY_TEMP ,v_sql); prepare stmt from sqltext; execute stmt; end ; / Oracle 下函数: CREATE OR REPLACE FUNCTION GET_PER_NAME_LEVEL( v_UserId VARCHAR2) RETURN VARCHAR2 IS v_UserName VARCHAR2(30); v_PrimaryPosition VARCHAR2(1); v_PersonLevel VARCHAR2(2); v_LevelName VARCHAR2(4000); v_Result VARCHAR2(4000); v_RecCount NUMBER; CURSOR c_PersonPosition IS SELECT PERSON.USER_NAME, POSITION.PERSON_LEVEL, POSITION.PRIMA RY_POSITION, PERSON_LEVEL.LEVEL_NAME FROM MOCHA_IM_PERSON PERSON, MOCHA_IM_PERSON_POSITION POSIT ION, MOCHA_IM_PERSON_LEVEL PERSON_LEVEL WHERE PERSON.USER_ID = POSITION.USER_ID AND POSITION.PERSON_LE VEL = PERSON_LEVEL.PERSON_LEVEL AND POSITION.USER_ID = v_UserId ORDER BY POSITION.PRIMARY_POSITION DESC; BEGIN SELECT COUNT(PERSON_LEVEL) INTO v_RecCount FROM MOCHA_IM_PER SON_POSITION POSITION WHERE USER_ID = v_UserId; IF v_RecCount=0 THEN SELECT USER_NAME INTO v_Result FROM MOCHA_IM_PERSON PERSON WHERE USER_ID = v_UserId; ELSE OPEN c_PersonPosition; LOOP FETCH c_PersonPosition INTO v_UserName, v_PersonLevel, v_PrimaryPositio n, v_LevelName; EXIT WHEN c_PersonPosition%NOTFOUND; v_Result := NVL(v_Result, CONCAT(CONCAT(v_Result, v_UserName), ); IF (v_PrimaryPosition = 1 AND (v_RecCount 1 OR SUBSTR(v_PersonLevel,2) 0 AND v_PrimaryPosition = 0) THEN v_Result := CONCAT(CONCAT(v_Result, 兼), v_LevelName); END IF; END LOOP; CLOSE c_PersonPosition; IF LENGTH(v_Result)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 IF; RETURN v_Result; END; Mysql 下函数: 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); DECLARE v_LevelName VARCHAR(4000); DECLARE v_Result VARCHAR(4000); DECLARE v_RecCount DECIMAL; DECLARE c_PersonPosition CURSOR FOR SELECT PERSON.USER_NAME, POSITION.PERSON_LEVEL, POSITION.PRIMA RY_POSITION, PERSON_LEVEL.LEVEL_NAME FROM MOCHA_IM_PERSON PERSON, MOCHA_IM_PERSON_POSITION POSIT ION, MOCHA_IM_PERSON_LEVEL PERSON_LEVEL WHERE PERSON.USER_ID = POSITION.USER_ID AND POSITION.PERSON_LE VEL = PERSON_LEVEL.PERSON_LEVEL AND POSITION.USER_ID = v_UserId ORDER BY POSITION.PRIMARY_POSITION DESC; SELECT COUNT(PERSON_LEVEL) INTO v_RecCount FROM MOCHA_IM_PER SON_POSITION POSITION WHERE USER_ID = v_UserId; IF v_RecCount=0 THEN SELECT USER_NAME INTO v_Result FROM MOCHA_IM_PERSON PERSON WHERE USER_ID = v_UserId; ELSE OPEN c_PersonPosition; REPEAT FETCH c_PersonPosition INTO v_UserName, v_PersonLevel, v_PrimaryPositio n, v_LevelName; IF NOT done THEN set v_Result = IFNULL(v_Result, CONCAT(CONCAT(v_Result, v_UserName), ); IF (v_PrimaryPosition = 1 AND (v_RecCount 1 OR SUBSTR(v_PersonLevel,2) 0 AND v_PrimaryPosition = 0) THEN set v_Result = CONCAT(CONCAT(v_Result, 兼), v_LevelName); END IF; END IF; UNTIL done END REPEAT; 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) = THEN set v_Result = SUBSTR(v_Result,1,LENGTH(v_Result)-2); END IF; END IF; RETURN v_Result; END; / 索引 普通索引,唯一索引,全文索引都支持,但是不支持 bitmap 索引。 其他: Oracle 用| 连接字符串,mysql 不支持|,但可以用 CONCAT 来连接,nvl 在 mysql 中是 ifnull,instr 函数 oracle 与 mysql 有些不同,oracle 支持的参数比 mysql 多,功能更 强大,但是 mysql 有 substring_index 配合 substring,length 可以做绝大多数的字符的操 作 为了支持中文,字符集选择 utf8,为了支持事务和行级锁选择存储引擎为 InnoDB 这些可以在 mysql 的配置文件里去改,也可以在建表的时候写进 sql 中 最后 mysql 与 oracle 的语法(临时表,表的 comment,定义变量啊等等)函数上的 区别还有很多。 MySQL 转换 Oracle 的七大注意事项 有很多应用项目, 刚起步的时候用 MySQL数据库基本上能实现各种功能需求,随着应 用用户的增多,数据量的增加,MySQL 渐渐地出现不堪重负的情况:连接很慢甚至宕机, 于是就有 MySQL转换 Oracle的需求,应用程序也要相应做一些修改。下面总结出 MySQL转 换 Oracle的几点注意事项,希望对大家有所帮助。 1自动增长的数据类型处理 MySQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。 Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列 号的下一个值赋于此字段。 CREATE SEQUENCE 序列号的名称 (最好是表名 序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值 为 999999 INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL 2. 单引号的处理 MySQL里可以用双引号包起字符串,Oracle 里只可以用单引号包起字符串。在插入和 修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。 3. 翻页的 SQL语句的处理 MySQL处理翻页的 SQL语句比较简单,用 LIMIT 开始位置, 记录个数;PHP 里还可以 用 SEEK定位到结果集的位置。Oracle 处理翻页的 SQL语句就比较繁琐了。每个结果集只 有一个 ROWNUM字段标明它的位置, 并且只能用 ROWNUMlt;100, 不能用 ROWNUM80。 以 下是经过分析后较好的两种 Oracle翻页 SQL语句( ID 是唯一关键字的字段名 ): 语句一: 1. SELECT ID, FIELD_NAME,. FROM TABLE_NAME WHERE 2. ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, 3. ID FROM TABLE_NAME WHERE 条件 1 ORDER BY 条件 2) 4. WHERE NUMROW 80 AND NUMROW lt; 100 ) ORDER BY 条件 3; 语句二: 1. SELECT * FROM ( SELECT ROWNUM AS NUMROW, 2. c.* from (select FIELD_NAME,. 3. FROM TABLE_NAME WHERE 条件 1 ORDER BY 条件 2) c) 4. WHERE NUMROW 80 AND NUMROW lt; 100 ) ORDER BY 条件 3; 4 长字符串的处理 长字符串的处理 Oracle也有它特殊的地方。INSERT 和 UPDATE时最大可操作的字符串 长度小于等于 4000 个单字节, 如果要插入更长的字符串, 请考虑字段用 CLOB类型,方法 借用 Oracle里自带的 DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断, 不能为空的字段值和超出长度字段值都应该提出警告, 返回上次操作。 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 找到离当前时间 7天用 DATE_FIELD_NAME SUBDATE(NOW(),INTERVAL 7 DAY)Oracle 找到离当前时间 7天用 DATE_FIELD_NAME SYSDATE - 7; 6. 空字符的处理 MySQL的非空字段也有空的内容,Oracle 里定义了非空字段就不容许有空的内容。 按 MySQL的 N

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论