oracle取mysql的数据库_oracle迁移mysql数据库注意(转)

本文详细列举了在将Oracle数据库迁移至MySQL过程中遇到的主要语法转换和注意事项,包括substr()、to_char()、nvl()、rownum、存储过程声明、日期处理、字符串连接、autocommit、别名使用、异常处理等方面的问题,以及如何解决这些问题以确保迁移后的兼容性和功能正确性。
摘要由CSDN通过智能技术生成

oracle转mysql修改:

1. substr()

substr( string , 0, 10) 这里测试 必须从 第一位获取 既是 substr(string , 1 , 10)

2. to_char()

只能用做oracle的函数,兼容oracle和mysql故 改为concat( … , '');

这里 使用了两个, 一个 是将类似 int 转为 string

3. select * from (select * from table2) 这里 要加别名

4. nvl函数

被改为 case when length(str)>0 then '处理1' else '处理2' end

5. 使用了oracle 获取当前日期 并格式化成yyyy-MM-dd 和前一天的日期

解决,将获取时间改成了 传值, java 获取当前时间和前一天日期传给数据库(mysql 有自带 的缓存,如果使用了 函数,他不会缓存,另外 为了兼容 mysql 和 ora  cle)

6. oracle rownum

select @rownum:=@rownum+1 rownum

from (select @rownum:=0 from table)

7. to_char(to_date(t1.create_date,'yyyy-MM-dd hh24:mi:ss'),'dateFormat’)

修改为了
STR_TO_DATE(t1.create_date, '%Y-%m-%d %h:%i:%s’)
DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'

8. 日期直接加减的含义不同了

比如Oracle中sysdate + 1 变成了sysdate() + interval 1 day(注意如果写成sysdate() + 1 语法还是正确的,但含义是错误的)

查询select sysdate() + 1 from dual 在MySQL得到比如 20080223153234(= 20080223153233 + 1)的数

9. select 'abc' || 'd' from dual 两个数据执行的结果不同(语法都能通过),MySQL要写成select concat('abc' , 'd')的形式

10. autocommit 注意 mysql 这个

11. 去掉别名

delete from table1 t where substr(t.trade_date,1,4)=?

这样的 sql 在 oracle 可以 但是在 mysql 需要把别名去掉

delete from table1 where substr(trade_date,1,4)=?

12. 存储过程

oracle 带参数声明

create or replace procedure THINKXDT.proc_update_seq(v_typename in varchar2,v_num out varchar2)

mysql 带参数声明

DROP PROCEDURE IF EXISTS `proc_update_seq`;

CREATE DEFINER=`root`@`%` PROCEDURE `proc_update_seq`(IN v_typename VARCHAR(200), OUT v_num VARCHAR(200))

oracle 参数为 (名称 IN/OUT 类型)

mysql 参数为 (IN/OUT 名称 类型) oracle 在存储过程声明变量 如下: 名称 类型; (在 begin 之前 create procedure() as 之后声明 mysql 在存储过程声明变量 如下: declare 名称 类型; (在begin 和 end 中声明)

oracle 在 存储过程 入参 有 带有 sys_refcursor 游标的参数,这样的mysql 不能用

oracle 使用了 表.Investor%TYPE 这种声明参数的时候 引用另外一个表的字段类型,mysql 里面最好直接 改为 那个类型

---------------------------------------------------------------------------

oracle 使用了 %rowtype 这种 声明一条结果集的 mysql不支持,解决(两部)

1.创建临时表

2.是吧这个里面的结果集字段 都单独的声明成一个 单独的变量

oracle 如下:

var_name tablename%rowtype; --声明参数

-- 赋值

select o.* into tablename from oldtablename as o where rownum=1

-- 使用

tablename.a 直接就是 字段a的值

mysql 如下:

-- oralce 的声明参数改为了 创建临时表

CREATE TEMPORARY TABLE IF NOT EXISTS tablename (

SELECT *

FROM oldtablename t

WHERE tag_type=p_tag_type

ORDER BY create_date DESC, id DESC

limit 1

);

-- 表中的字段都要创建一个 变量

declare a int default -1;

declare b int;

-- 赋值

select t.a into a from tablename as t where limit 1;

select t.b into b from tablename as t where limit 1;

-- 使用

-- 直接 使用 变量 a b

-- 使用完后 需要

-- 清除临时表

TRUNCATE TABLE tmpTable;

---------------------------------------------------------------------------

判断 字符是否 为空 可以直接 LENGTH(字符) ,长度 <= 0 即为 空

oracle 中 存储过程可以return

mysql 需要 弄一个标记

如下:

begin 的 改为 label:begin 此时加了一个 label名字的标记

oracle 中 return 改为 leave label; 即可

oracle存储过程中给变量赋值 可以直接 赋值 var_name := 10;

mysql 需要这种修改 set var_name := 10; (mysql 必须加上set)

oracle 存储过程返回值 需要在参数里面加上 status_rc out sys_refcursor

然后

open status_rc for

select '-10000' as rscode, 'XXX不能为空' as rsmsg from dual;

return;

mysql 直接

select '-10000' as rscode,

'操作方向格式不正确(只能为‘+’或‘-’)' as rsmsg

from dual;

leave label;

mysql 存储过程中的异常处理 如下:

-- 异常处理 begin 后 声明变量的时候加上下面的

declare _err int default 0;

declare continue handler for sqlexception, sqlwarning, not found set _err=1;

-- 代码结尾 加上

if _err=1 then

rollback;

select '-10000' as rscode, 'XXXX异常!' as rsmsg from dual;

leave label;

end if;

13. 注意值,有些只 默认不是为空的 而是 为 null

14. to_char(sysdate, 'yyyy-mm-dd')

改为:DATE_FORMAT(now(), '%Y-%m-%d')

15. 如果字段类型是 varchar 但是 此字段值是数字,想以此字段排序,mysql 需要 查出来后 +0 就会自动转为 int 类型了

http://www.cnblogs.com/loveismile/p/5030911.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值