很久之前做过的一个典型数据割接,和大家分享下:

需求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'')'

);

insert into comment_ctrl

(

tablename,

actionsql,

isnumber,

maxandminsql

)

values

(

'us_usercomment',

'update us_usercomment t

set t.isnotcnchar = decode(t.content,convert(t.content, ''US7ASCII'', ''ZHS16GBK''),

''0'',

''1'')

where t.msisdn >= :a and t.msisdn < :b',

'0',

'select max(t.msisdn),min(t.msisdn)  from us_usercomment t'

);

insert into comment_ctrl

(

tablename,

actionsql,

isnumber,

maxandminsql

)

values

(

'us_topic',

'update us_topic t

set t.isnotcnchar = decode(t.content,convert(t.content, ''US7ASCII'', ''ZHS16GBK''),

''0'',

''1'')

where t.topicid >= :a and t.topicid < :b',

'1',

'select max(t.topicid),min(t.topicid)  from us_topic t'

);

insert into comment_ctrl

(

tablename,

actionsql,

isnumber,

maxandminsql

)

values

(

'us_leaveword',

'update us_leaveword t

set t.isnotcnchar = decode(t.leaveword,convert(t.leaveword, ''US7ASCII'', ''ZHS16GBK''),

''0'',

''1'')

where t.leavewordid >= :a and t.leavewordid < :b',

'1',

'select max(t.leavewordid),min(t.leavewordid)  from us_leaveword t'

);

commit;

--割接us_publiccomment表

alter table us_publiccomment add isnotcnchar varchar2(1) default '0' not null;

comment on column us_publiccomment.isnotcnchar

is '非汉字内容 0 非汉字 1 汉字内容';

--对us_bookcomment_audit数据割接

alter table us_bookcomment_audit add isnotcnchar varchar2(1) default '0' not null;

comment on column us_bookcomment_audit.isnotcnchar

is '非汉字内容 0 非汉字 1 汉字内容';

--对书评发布表(us_bookcomment_publish)表进行数据割接

alter table us_bookcomment_publish add isnotcnchar varchar2(1) default '0' not null;

comment on column us_bookcomment_publish.isnotcnchar

is '非汉字内容 0 非汉字 1 汉字内容';

--对us_usercomment表进行数据割接

alter table us_usercomment add isnotcnchar varchar2(1) default '0' not null;

comment on column us_usercomment.isnotcnchar

is '非汉字内容 0 非汉字 1 汉字内容';

--对us_topic表进行数据割接

alter table us_topic add isnotcnchar varchar2(1) default '0' not null;

comment on column us_topic.isnotcnchar

is '非汉字内容 0 非汉字 1 汉字内容';

--对us_leaveword表进行数据割接

alter table us_leaveword add isnotcnchar varchar2(1) default '0' not null;

comment on column us_leaveword.isnotcnchar

is '非汉字内容 0 非汉字 1 汉字内容';

--创建业务存储过程

create or replace procedure pro_addclomn_comment

(

tablename  in varchar2,--目标表名

ispartition in varchar2--是否分区表 '0'不是分区 '10'范围(时间)分区  '11' hash分区 可自由扩展

)

/*

* 评论等表增加是否非汉字字段业务处理

* @param tablename 目标表名

* @param ispartition 是否分区表 '0'不是分区 '10'范围(时间)分区  '11' hash分区 可自由扩展

* @author xKF24575

* @version [版本号, May 18, 2011]

* @see [相关类/方法]

* @since [产品/模块版本]

*/

is

--resultchar       varchar2(256);--执行结果

partitionname    varchar2(256);--分区名称

v_cs_sql         varchar2(1024);--动态游标sql

v_sql            varchar2(1024);--执行sql

v_sql_temp       varchar2(1024);--执行sql

v_error          varchar2(2048);--出错日志

v_countsql       varchar2(1024);--计算最大、小值sql

v_isnumber       varchar2(1);   --是否是数字类型

n_max            number(30);

n_min            number(30);

n_cur            number(30);

n_tmp            number(30);

v_max            varchar2(30);

v_min            varchar2(30);

v_cur            varchar2(30);

v_tmp            varchar2(30);

TYPE t_ref_cursor IS REF CURSOR;

c                t_ref_cursor; --动态游标

begin

if ispartition = '10' then --是范围分区表

v_cs_sql := 'select PARTITION_NAME

from USER_TAB_PARTITIONS

where TABLE_NAME = upper(:a) and PARTITION_NAME <> ''P1''';

v_sql_temp :='select actionsql from comment_ctrl where tablename = :c';

open c for v_cs_sql using tablename;

fetch c into partitionname;

while c% found loop

execute immediate v_sql_temp into v_sql using tablename;

v_sql := replace(v_sql,':a',partitionname);

execute immediate v_sql;

commit;--以分区commit一次

fetch c into partitionname;

end loop;

end if;

if ispartition = '0' then --不是分区表

v_sql_temp :='select actionsql,isnumber,maxandminsql from comment_ctrl where tablename = :c';

execute immediate v_sql_temp into v_sql,v_isnumber,v_countsql using tablename;

if v_isnumber = '1' then --是数字id

execute immediate v_countsql into n_max,n_min;

n_cur := n_min;

while (n_cur <= n_max) loop

n_tmp := n_cur + 20000;   --这里就是借鉴list分区的思路了

execute immediate v_sql using n_cur,n_tmp;

commit;

n_cur := n_tmp;

end loop;

end if;

if v_isnumber = '0' then --是字符id

execute immediate v_countsql into v_max,v_min;

v_cur := v_min;

while (v_cur <= v_max) loop

v_tmp := v_cur + '10000000';--这里就是借鉴list分区的思路了

execute immediate v_sql using v_cur,v_tmp;

commit;

v_cur := v_tmp;

end loop;

end if;

end if;

commit;

exception

when others then

v_error := sqlcode || ' - ' || sqlerrm;

prc_iread_sys_writelog (2,4,'pro_addclomn_comment',v_error,'');

end pro_addclomn_comment;

/

begin

pro_addclomn_comment('us_publiccomment','0');

end;

/

begin

pro_addclomn_comment('us_bookcomment_audit','1');

end;

/

begin

pro_addclomn_comment('us_bookcomment_publish','1');

end;

/

begin

pro_addclomn_comment('us_usercomment','0');

end;

/

begin

pro_addclomn_comment('us_topic','0');

end;

/

begin

pro_addclomn_comment('us_leaveword','0');

end;

/

oracle 数据库割接,oracle的一次数据割接(1)相关推荐

  1. 数据如何导入oracle数据库,如何用Oracle导入导出工具来实现Oracle数据库移植?

    Oracle数据库作为目前市场的主流数据库之一,许多应用都在其上进行开发,由于Oracle数据库更新换代的原因和不同的应用程序提供商,可能会造成在一个单位的应用中存在Oracle的几种版本,如Orac ...

  2. Oracle数据库教程(Oracle备份、恢复、升级、迁移)视频教程

    Oracle数据库教程(Oracle备份.恢复.升级.迁移)视频教程 风哥Oracle备份恢复与迁移升级专题包括:Oracle备份恢复基础.用户模式的备份恢复.RMAN备份恢复.Flashback闪回 ...

  3. 快速清除oracle多个表,Oracle数据库之批量清除一个表的数据,TB级别数据

    本文主要向大家介绍了Oracle数据库之批量清除一个表的数据,TB级别数据,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 有个需求,要求清理8TB的数据,只保留一个月的数据,现 ...

  4. oracle数据库基础测试,ORACLE数据库基础测试题oracle数据库复习题.docx

    <ORACLE数据库基础测试题oracle数据库复习题.docx>由会员分享,可在线阅读,更多相关<ORACLE数据库基础测试题oracle数据库复习题.docx(18页珍藏版)&g ...

  5. oracle中毒,oracle数据库中毒恢复 oracle数据库解密恢复 服务器中勒索病毒解密恢复.Hermes666...

    oracle数据库中毒恢复 oracle数据库解密恢复 服务器中勒索病毒解密恢复.Hermes666 客户名称 保密 数据类型 oracle 11G 数据容量 100 gb 故障类型 服务器中毒,文件 ...

  6. oracle 连接组件,[2021] node连接oracle数据库示例[使用oracle官方组件]

    [2021] node连接oracle数据库示例[使用oracle官方组件] node 连接 oracle 示例 本示例采用的 oracledb 和 instantclient-basic-windo ...

  7. 视频教程-oracle数据库快速入门-Oracle

    oracle数据库快速入门 十年项目开发经验,主要从事java相关的开发,熟悉各种mvc开发框架. 王振伟 ¥21.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 AP ...

  8. oracle数据库的并发控制,Oracle数据库—— 事务处理与并发控制

    一.涉及内容 1.理解事务的概念和几个特性. 2.熟练掌握事务管理命令的使用. 3.理解并发操作的概念和数据库锁的类型. 二.具体操作 (12.5 实验) 1. 分析以下代码,说出代码中的哪些部分体现 ...

  9. oracle免费的环境,【Oracle数据库免费版】Oracle数据库官方下载 v11gR2 免费版-趣致软件园...

    Oracle数据库免费版是一款比较实用的数据库软件,内含强大的功能,支持对数据的完整管理,而且还能实现保存的持久性.Oracle数据库官方版采用了分布式的处理,支持各种数据库的运行,同时软件还能为大大 ...

  10. oracle11g数据库版本号,Oracle数据库之关于oracle db 11gR2版本号上的參数和scn headroom补丁问题...

    本文主要向大家介绍了Oracle数据库之关于oracle db 11gR2版本号上的參数和scn headroom补丁问题,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 关于o ...

最新文章

  1. linux源码安装浏览器,Linux系统手动安装Firefox浏览器
  2. 使用vue-cli快速构建项目--vue.js学习笔记1
  3. C++--深入分析MFC文档视图结构(项目实践)
  4. Spring构造函数注入和参数名称
  5. 关于mysql无法添加中文数据的问题以及解决方案
  6. ajax-loader.gif不存在怎么解决_高温下水泥路面材料膨胀路面上出现裂缝怎么处理?...
  7. SVN和Git 介绍,区别,优缺点,适用范围总结
  8. java实现杨辉三角
  9. 图解linux文件系统,linux系统的基本构成和文件系统的结构(配图解)
  10. 5G承载网需求与技术实现
  11. 计算机系新春祝福语,春节的祝福语
  12. [Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
  13. 世界最大暗物质探测器成功运行!首个结果出炉,研究团队达250人,实验室在地下1.5公里...
  14. 中间商只会赚差价?论接口的重要性
  15. 信度不达标的处理方式
  16. CDH 配置CM Server的数据库时错误
  17. PageRank算法改进
  18. Python批量获取4K图片
  19. 计算机英语第四版原文录音,英语美文朗读:I'm in my late twenties(含MP3录音)
  20. APP安装个性化的优点

热门文章

  1. HDU 1574 RP问题(DP)
  2. 芝麻小程序市场 - 小程序的二维码商店
  3. PMP项目管理考试建议 | 培养正确的PMP答题思路
  4. IFS系统功能清单之一——IFS通用组件
  5. IFS Applications权限架构
  6. Nets Wire has multiple names
  7. 网络云存储技术Windows server 2012 (项目十三 NFS共享的配置与管理)
  8. U盘突然变成Raw格式,无法读写数据
  9. 如果你觉得学习 Git 很枯燥,那是因为你还没玩过这款游戏!
  10. FANUC 0I 系列打开系统刀具寿命管理功能