博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle迁移mysql数据库注意(转)
阅读量:7069 次
发布时间:2019-06-28

本文共 4331 字,大约阅读时间需要 14 分钟。

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

转载于:https://www.cnblogs.com/softidea/p/5309234.html

你可能感兴趣的文章
PostgreSQL通过mysql_fdw访问MySQL数据库
查看>>
REST风格的原则
查看>>
Struts分页的一个实现
查看>>
[LintCode] Nuts & Bolts Problem 螺栓螺母问题
查看>>
53.2. group_concat() 列传行
查看>>
I.MX6 SHT20 Linux 驱动移植
查看>>
7.4. String
查看>>
使用PHP配置文件
查看>>
【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
查看>>
开发网站合集
查看>>
fastcgi配置
查看>>
[转]Java中堆和栈创建对象的区别
查看>>
Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机...
查看>>
咪蒙这么火是怎么做到的
查看>>
【&#9733;】路由环路大总结!
查看>>
Spring源码学习之:ClassLoader学习(5)-自测
查看>>
awesome-nlp
查看>>
第 102 章 Ntop
查看>>
利用路由器连接别人家的网络
查看>>
TinyXml学习笔记
查看>>