最近一段时间,服务的项目正在进行数据库迁移工作,总结了一些关键点,希望能对大家有所帮助,核心配置文件的更改这里不在做介绍。
目录:
- 表名或列名过长
- 自增长需使用序列,映射文件id增长修改
- 注意视图、函数、存储过程等等的迁移,实现方法会有不同
- 字段不能使用[]中括号
- case 条件 when \'字符串\' then ....,如果条件为字段,需是varchar2类型
- 大数据使用clob类型时,查询时使用to_char(clob)即可
- 部分函数在oracle中不存在,或使用方法不同
- 表别名 不使用as,列别名,as可有可无;使用别名时注意不要使用单引号
- 如果选择列有时间字段需要显示时分秒,需要to_char
- oracle中区分大小写,新增或查询数据时需做相应调整
- 如需修改表名,请确认是否有其它系统使用此表,并使用旧表名新建新表名的同义词
- oralce的分页sql,如果排序字段不唯一,导致分页数据重复
1、表名或列名过长:
在oracle中长度不能超过30。
2、自增长需要使用序列,修改映射文件中id增长:
为了规范,我们这里统一在表名后面加\'_seq\',当然,表名的长度没有超过26。关于创建序列,我们是这样处理的:
首先将表名及表中id的最大值放在临时表中(这里是tempwcj),执行select语句,将结果执行。
create table tempwcj ( TABLENAME varchar2(30) not null, MAXID number );
select \'insert into tempwcj select \' || \'\'\'\' || table_name || \'\'\'\' || \' ,(case when max(id) is null then 1 else max(id)+1 end) maxid from \' || table_name || \';\' from user_tab_columns where column_name = \'ID\';
然后根据临时表创建序列:
select \'create sequence \' || tablename || \'_SEQ minvalue 1 maxvalue 999999999999999999999999 start with \'||maxid||\' increment by 1 cache 10;\' from tempwcj;
3、注意视图、函数、存储过程等等的迁移,实现方法会有不同:
这里不用多说,需要的东西肯定都要迁移,只是迁移过来的东西很多都需要修改。比如一个表值函数,在sqlserver中是这样的
ALTER FUNCTION [dbo].[getDateList] ( @StartTime datetime, @EndTime datetime) RETURNS @retable TABLE(dDate varchar(10)) AS BEGIN while @StartTime <= @EndTime begin insert into @retable select convert(varchar(10),@StartTime,23) set @StartTime=Dateadd(day,1,@StartTime) end return end
而在oracle中实现,你需要做的更多
create or replace type getdatelist_Retable as object( dDate varchar2(120) ); -----------------------使用嵌套表------------------------------- create or replace type getdatelist_Retable_table as table of getdatelist_Retable; ---------------------------------------------------------------- CREATE OR REPLACE Function getDateList ( StartTime In VARCHAR2, EndTime In VARCHAR2 ) RETURN getdatelist_Retable_table AS retable getdatelist_Retable_table := getdatelist_Retable_table(); BEGIN FOR i IN 1 .. (to_date(EndTime,\'yyyy-mm-dd\')-to_date(StartTime,\'yyyy-mm-dd\')+1) LOOP BEGIN retable.EXTEND; retable(i) := getdatelist_Retable(to_char(to_date(StartTime,\'yyyy-mm-dd\')+i-1,\'yyyy-MM-dd\')); END; END LOOP; RETURN retable; END;
4、字段不能使用[]中括号:
有些字段在sqlserver中是关键字,在sql语句中需要使用[],不只是为什么有些很普通的字段也加了[],但是不管怎样在oracle中必须去掉。
select * from uu_user_function uuf where uuf.[function] = 12;
5、case 条件 when \'字符串\' then ....,如果条件为字段,需是varchar2类型:
这一点在代码中很难看的出来,在数据库迁移时,注意别搞错了字段类型。
select ht.itcode,(case ht.accyear when \'2013\' then \'当前年份\' else \'其他年份\' end) as accyear from HR_TOTALASSESS ht;
如果accyear为NVARCHAR2类型,执行sql时会提示“字符集不匹配”。
6、大数据使用clob类型时,查询时使用to_char(clob)即可:
在oracle中,varchar2的最大长度为4000,从oracle8开始,建议使用CLOB类型存储大批量字符,建议使用BLOB类型存储大批量二进制数据。
当然用select 查询时,返回的是定位符,如果需要显示数据,可以使用to_char(clob类型字段)。
select t.skillname,to_char(t.skilldesc) from skill t; --下面奉上更改列类型的sql,我这里直接更改为clob时提示“数据类型的更改无效”-- --------------创建临时列---------------------- alter table SKILL add TEMPCOL clob; ------将需要更改类型的列更新到临时列---------- update skill set TEMPCOL = SKILLDESC ; -----------删除需要更改类型的列--------------- alter table SKILL drop column SKILLDESC; --------------重命名临时列-------------------- alter table SKILL rename column TEMPCOL to SKILLDESC;