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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: oracle转mysql修改:1. substr() substr( string , 0, 10) 这里测试 必须从 第一位获取 既是 substr(string , 1 , 10)2. to_char() 只能用做oracle的函数,兼容oracle和mysql故 改为concat( … , ''); 这里 使用了两个, 一个 是将类似 int 转为 string 3.
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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
39 7
|
22天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(3)
Oracle数据库基本概念理解(3)
15 2
|
4天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
27 4
|
22天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(2)
Oracle数据库基本概念理解(2)
13 1
|
4天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
30 7
|
22天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(1)
Oracle数据库基本概念理解(1)
11 1
|
22天前
|
Oracle 关系型数据库 MySQL
Seata常见问题之oracle 数据库 报 just support mysql如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
53 0
|
25天前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
|
27天前
|
关系型数据库 MySQL 数据库
使用阿里云的数据传输服务DTS(Data Transmission Service)进行MySQL 5.6到MySQL 8.0的迁移
【2月更文挑战第29天】使用阿里云的数据传输服务DTS(Data Transmission Service)进行MySQL 5.6到MySQL 8.0的迁移
215 2
|
Oracle 关系型数据库 数据库
oracle数据库控制文件的备份和恢复之三RMAN自动备份和恢复
使用RMAN自动备份的控制文件向数据库中恢复控制文件
308 0

推荐镜像

更多