sqlserver数据库迁移至oracle数据库(下)

本文详细介绍了在迁移和优化Oracle数据库时的关键注意事项,包括表名和列名的长度限制、自增长列的实现、视图和函数的迁移方法、SQL语法的使用规则、时间字段的显示方式、大小写敏感性、表名修改的影响、分页查询的优化、别名的正确使用以及大数据存储类型的选择。此外,文章还强调了在操作过程中需谨慎考虑数据库依赖情况,以避免潜在的系统崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

  1. 表名或列名过长
  2. 自增长需使用序列,映射文件id增长修改
  3. 注意视图、函数、存储过程等等的迁移,实现方法会有不同
  4. 字段不能使用[]中括号
  5. case 条件 when '字符串' then ....,如果条件为字段,需是varchar2类型
  6. 大数据使用clob类型时,查询时使用to_char(clob)即可
  7. 部分函数在oracle中不存在,或使用方法不同
  8. 表别名 不使用as,列别名,as可有可无;使用别名时注意不要使用单引号
  9. 如果选择列有时间字段需要显示时分秒,需要to_char
  10. oracle中区分大小写,新增或查询数据时需做相应调整
  11. 如需修改表名,请确认是否有其它系统使用此表,并使用旧表名新建新表名的同义词
  12. oralce的分页sql,如果排序字段不唯一,导致分页数据重复

7、部分函数在oracle中不存在,或使用方法不同:

  比较常见的是这些函数top、convert、getdate()

------------top返回确定数目的数据(例如前10条记录)--------------
select top 10 * from uu_user_function uuf where uuf.[function] = 12;
------------下面显示的是总数目10%条的记录----------------------
select top 10 percent * from uu_user_function uuf where uuf.[function] = 12;

  top函数在oracle中不存在,如果返回确定数目的时候,可以使用rownum替代。

  convert()函数用于处理日期使用不同的格式显示

------在sqlserver中------
SELECT CONVERT(varchar,GETDATE(),120);
------在oracle中---------
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

8、表别名 不使用as,列别名,as可有可无;使用别名时注意不要使用单引号:

  在sqlserver中表和列使用别名时 as 可有可无,但在oracle中,表使用表名时,不能使用as;

  别名可以使用双引号或者不使用引号,但是如果别名是多个字符串,必须使用双引号。

select s.id skillid,
       s.skillname "技能名称",
       to_char(s.skilldesc) as "skill desc",
       s.skilltype 技能类型
  from skill /*as */ s;

 

9、如果选择列有时间字段需要显示时分秒,需要to_char:

  这个本不是问题,如果原来使用的是convert时间显示是'2012-12-31 23:59:59',目前oracle数据库中该字段存储的数据就是这样的格式

        sql.append("select bdr.id,to_char(bdr.createDate,'yyyy-MM-dd') as createDate, ");
        sql.append("to_char(bdr.createTime,'yyyy-MM-dd hh24:mi:ss') as createTime,to_char(bdr.planOfDay),to_char(bdr.nodule), ");

  代码中的createDate和createTime在oracle中的格式都是date,包含年月日时分秒。

Query query = getSession().createSQLQuery(sql);
//如果去掉上面代码中bdr.createDate和bdr.createTime的to_char(),在这里得到的list里面的时间格式就已经没有了时分秒

 

10、oracle中区分大小写,新增或查询数据时需做相应调整:

  关于oralce区分大小写,应该大家都很清楚。sql关键字不区分大小写,对象名和列名不区分大小写,但是字符值和日期值区分大小写

----user_tables 显示当前用户所有表 的视图----
select
* from user_tables ut where ut.tablespace_name = upper('users');

 特别是检索信息的时候,如果输入的字符串未做处理,而且数据库中刚好存储的是大写,这样就会导致检索不出想要的数据。当然你可以在前台控制输入大小写,或者后台toLowerCase()

或toUpperCase(),或者在sql中upper()或lower(),或者更改数据库数据。也许你会有更好的办法。

 

11、如需修改表名,请确认是否有其它系统使用此表,并使用旧表名新建新表名的同义词:

  这里有一个教训,迁移数据库后,更改了两个表名,当然忘记考虑了一下,是不是有其他系统使用这两个表,结果导致了另外一个项目的一个模块几近瘫痪。还好当时立刻新建了两个同义词,算是搞定了。其实后来才知道,在数据库中,更改表名等同于删除表,很严重的。

 

12、oralce的分页sql,如果排序字段不唯一,导致分页数据重复:

    这种情况用户一般从前台使用时,很难发现,因为只有在所有的排序字段都不能唯一确定数据的时候,才会出现。

  没有什么好办法,在排序字段里面增加一个唯一数据的字段就可以了,比如主键,因为oracle的排序算法不具稳定性。

转载于:https://www.cnblogs.com/wcj112/p/3382193.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值