项目从Mysql改为Oracle过程记录

602 阅读2分钟

1、使用Navicat Preminm工具将mysql表结构与数据转为oracle表格式
1.1 工具(tools)->数据传输->勾选源数据库、目标数据库->下一步->可取消勾选对应的表->开始
1.2 查看表名和字段名大小写(应该都是小写、跟mysql命名一样),使用语句将表名和字段名都改为大写

begin
   for t in (select table_name tn from user_tables where table_name <> upper(table_name)) loop
       begin
          for c in (select column_name cn from user_tab_columns where table_name=t.tn) loop
              begin
                 execute immediate 'alter table "'||t.tn||'" rename column "'||c.cn||'" to '||c.cn;
              exception
                 when others then
                    dbms_output.put_line(t.tn||'.'||c.cn||'已经存在');
              end;
          end loop;
          execute immediate 'alter table "'||t.tn||'" rename to '||t.tn;
          exception
             when others then
                dbms_output.put_line(t.tn||'已存在');
       end;
   end loop; 
end;

1.3 将库导出sql语句,打开将对应的N开头的字段类型都改为非N开头对应的字段类型,重新导入 表空间、表名大小写敏感,导入时注意,全局替换
2、Java代码改动
2.1 方言、数据源、驱动配置
2.2 代码改动:

1> oracle表名后不能用AS起别名,可以直接表名跟别名,字段可以使用AS起别名
2> to_days改为(格式根据情况而定):
   TO_CHAR(sysdate,'MM/DD/YYYY')
   TO_DATE(sysdate, 'yyyy-mm-dd')
   TO_DATE(TO_CHAR(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd')
3> Limit改为
   SELECT * from (原sql) where rownum < 11(非分页,查前多少个记录)
4>若字段为Clob类型,查询出来的为List<Map>集合的则需要对结果进行转型
try {
 for(Map<String,Object> data : list) {
     for (String key : data.keySet()) {
         if (data.get(key) instanceof Clob){
            Clob clob = (Clob) data.get(key);
            data.put(key, clob.getSubString((long)1,(int)clob.length()));
         }
     }
 }
} catch (SQLException e) {
   e.printStackTrace();
}
5> ifnull 改为 nvl
6> 判断集合中是否包含某个元素
   FIND_IN_SET('1',type) > 0 改为 instr(','||type||',',',1,') > 0
7> CONCAT拼接字符串的换成||连接
8> UUID() 换成 sys_guid()
9> IF 函数 换成 DECODE 函数
   IF(条件,结果值)
   DECODE(VALUE, IF1, THEN1, IF2, THEN2, IF3, THEN3, ......, OTHER);
   表示如果VALUE等于IF1时,DECODE函数的结果返回THEN1,......,如果不等于任何一个if值,则返回OTHER
10> 返回前端页面的类型:
    a) 若为List<Map<String,Object>>类型则前端使用字段要改为大写
    b) 若为VO实体类型则不需要改动,仍为之前的驼峰式