wcj112

  最近一段时间,服务的项目正在进行数据库迁移工作,总结了一些关键点,希望能对大家有所帮助,核心配置文件的更改这里不在做介绍。

目录:

  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,如果排序字段不唯一,导致分页数据重复

 

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;

 

分类:

技术点:

相关文章:

  • 2021-11-19
  • 2021-10-29
  • 2021-10-14
  • 2022-12-23
  • 2021-10-16
  • 2022-12-23
  • 2022-01-06
猜你喜欢
  • 2021-11-26
  • 2021-03-30
  • 2021-12-02
  • 2021-06-26
  • 2022-01-04
  • 2022-12-23
相关资源
相似解决方案