数据割接典例(1)

需求1:对多个表新增同一字段,新增字段初始值必须依赖于各表的内容大字段,而各表表结构不一样(有关联的就只是表里都有一个类似评论的字段,而新增的字段只是标示这个字段是不是有中文)。

    疑问1:对于同时割接6张表,面对不同表结构的它们是否能用同一方法处理?还是一个一个表处理。
  
    疑问2:中文字段如何判断。

  分析:6张表大概可以分为分区和不分区两大类。
     
          联想到有可能是逐条数据处理的情况一般都是从它们的表主键或者索引作为突破口(和表分区的思路一样,分区有范围、list、hash分区都可以借鉴)。
     
        继续细分不分区的表:可分为主键为varchar2和number类型的表(其实这几个不分区的表主键都是number类型的,当初建表没同一处理可当做是涉及失误导致后面的麻烦)

       对于中文判断:Oracle有个函数:convert转换函数估计大家有些人已经接触过了,对于非汉字有着将其转ascii码和其不变的特性,而中文的话就不同了。
--创建控制表
create table comment_ctrl
(
    tablename varchar2(50), 
    actionsql varchar2(1024),
    isnumber  varchar2(1),
    maxandminsql    varchar2(1024) 
)
tablespace TBS_MREAD_DAT;
comment on column comment_ctrl.tablename
  is '表名';
comment on column comment_ctrl.actionsql
  is '执行的sql';
comment on column comment_ctrl.isnumber
  is 'id字段是否是number类型 0否 1是';
comment on column comment_ctrl.maxandminsql
  is '计算最大\小值sql';

insert into comment_ctrl
(
   tablename, 
   actionsql,
   isnumber,
   maxandminsql
)
values
(
   'us_publiccomment',
   'update us_publiccomment t
   set t.isnotcnchar = decode(t.commentary,convert(t.commentary, ''US7ASCII'', ''ZHS16GBK''),
                              ''0'',
                              ''1'')
where t.bookreviewid >= :a and t.bookreviewid < :b',
'1',
'select max(t.bookreviewid),min(t.bookreviewid)  from us_publiccomment t'
);
insert into comment_ctrl
(
   tablename, 
   actionsql
)
values
(
   'us_bookcomment_audit',
   'update us_bookcomment_audit  partition(:a)
   set isnotcnchar = decode(commentary,convert(commentary, ''US7ASCII'', ''ZHS16GBK''),
                              ''0'',
                              ''1'')'
);
insert into comment_ctrl
(
   tablename, 
   actionsql
)
values
(
   'us_bookcomment_publish',
   'update us_bookcomment_publish  partition(:a)
   set isnotcnchar = decode(commentary,convert(commentary, ''US7ASCII'', ''ZHS16GBK''),
                              ''0'',
                              ''1'')'
);

你可能感兴趣的:(数据结构,oracle,sql)