【oracle】更新大批量数据变更步骤

    生产环境中遇到更新或者删除大批量数据的时候,不能直接进行操作,要批量进行。

1 获取要进行更新的数据的主键,保存为文本文件或者csv文件。这一步一定要正确,否则下面的操作会造成更新错误的数据,造成数据不一致!

2 创建临时表并将获取的数据主键导入到创建!

#!/bin/sh 

# Created by yangql on 2011-11-23

# Parameters 

## . /home/oracle/.profile

ORA_USER=yang

ORA_PASSWD=yang

TODAY=`date +"%F"`

LOG_FILE=/home/oracle/yangql/${ORA_USER}_${TODAY}.log

im_dz()

{

sqlplus -s ${ORA_USER}/$ORA_PASSWD <> $LOG_FILE

select sysdate from dual;

--1.--Create Temp Tables

create table yang.bak_da_20111123_1740 as select LONGID from yang.udb where 0=1;

--2.--Load ID need to be DA with sqlldr

set define off

! nohup sqlldr yang/yang control=./yang_udb_20111123_1740.ctl direct=true log=./yang_udb_20111123_1740.${today}.log > sqlldr_da-of-20111123-1740.ctl.`date +%Y%m%d-%H%M%S`.yql.log 2>&1 &

set define on

--3.--Backup Original Data to TempTable

select * from user_objects where created > sysdate-1;

select sysdate from dual;

exit;

EOF

return $?

}

im_dz &&

echo -e "`date +%Y%m%d-%H%M%S`: dz_20111123-1740_step1 DA(Data Admendment) is started by yangql - SUCCESS " >> $LOG_FILE||

echo -e "`date +%Y%m%d-%H%M%S`: dz_20111123-1740_step1 DA(Data Admendment) is started by yangql - FAIL " >> $LOG_FILE

exit 0

######################

#sqlldr 导入的控制文件

#load data

#infile '/home/oracle/yangql/20111123_YANG_UDB.csv'

#insert

#into table yang.bak_da_20111123_1740 FIELDS TERMINATED BY 'chr(10)' (longid)

#####################

3 使用一个过程,每隔更新1000行,commit一次并删除备份表中的数据。

--cat > dz_20111123_1820_step3.sh

#!/bin/sh 

# Created by yangql @ 2011-11-23

# Parameters 

## . /home/oracle/.profile

ORA_USER=yang

ORA_PASSWD=yang

TODAY=`date +"%F"`

# LOG_FILE=/tmp/oracle/${ORA_USER}_${TODAY}_log

ALERT_LOG=/opt/oracle/admin/alisoft/bdump/alert_im1.log

dz()

{

sqlplus ${ORA_USER}/$ORA_PASSWD <
@L_MyLoginU --

select sysdate from dual;

@dz_20111123_1820_step3.sql

select sysdate from dual;

exit;

EOF

return $?

}

dz &&

echo -e "`date +%Y%m%d-%H%M%S`: dz_20111123_1820_step2 DA(Data Admendment) is started by yangql- SUCCESS " >> $ALERT_LOG ||

echo -e "`date +%Y%m%d-%H%M%S`: dz_20111123_1820_step2 DA(Data Admendment) is started by yangql- FAIL " >> $ALERT_LOG

exit 0

---执行过程的脚本:

--cat > dz_20111123_1820_step3.sql

-- Created by yangql @ 2011-11-23

declare

cursor cur is

  select 

      longid

      ,rowid

  from yang.bak_da_20111123_1740

      -- where user_value is NULL

  ;

  v_count number:=0;

  v_commit_count number:=0;

  v_limit number :=1000;

----

  v_lcl__USER_VALUE number;

  v_lcl__ALIPAY_AUTH number;

begin

 for x in cur

      loop 

        v_count:=v_count+1;

begin

update yang.udb t set t.contactshowflag=1 where t.longid = x.longid;

    exception

when NO_DATA_FOUND then

     dbms_output.put_line('----EXCEPTION--: longid '''||x.longid||''' is NOT FOUND in table yang.udb !!!');

end;

delete yang.bak_da_20111123_1740

where rowid=x.rowid;

                        

if v_count=v_limit then

   v_commit_count:=v_commit_count+1;

   commit;

     dbms_output.put_line('--RECORDS UPDATED AND COMMITED: '||v_count||' * '||v_commit_count);

   v_count:=0;

 end if;   

end loop;

     

commit;

dbms_output.put_line('--RECORDS UPDATED AND COMMITED - LAST BATCH: '||v_count);

end;

/

<>

时间: 2024-10-29 06:43:02

【oracle】更新大批量数据变更步骤的相关文章

oracle数据库-跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢

问题描述 跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢 如题:org_info 表内容如下: ID NAME TEL ADDR OP_TYPE OCCUR_DATE 1001 aaa 888888 ppppppp 2014-07-23 1001 aaa 999999 ppppppp 2011-03-19 1002 bbb 666666 yyyyyyy 2014-09-15 1002 ipow 221 fghfghfh 2009-07-08 1002 ipow

coredata数据变更后tableView的数据无法更新

问题描述 coredata数据变更后tableView的数据无法更新 在coredata插入或删除数据后,tableView的数据无法更新,NSFetchedResultsController对应的delegete也没有响应.重新运行程序后tableView的数据才能更新. 解决方案 在coredata插入或删除数据后,[tableView reloadData]一下就行了,你不手动刷新一下表视图,他怎会刷新呢?

探讨ORACLE数据库的数据导入方法

oracle|数据|数据库 前言每个数据库管理员都会面临数据导入的问题,这有可能发生在数据库的新老移植过程中,或者是在数据库崩溃后的恢复重建过程中,还有可能是在创建测试数据库的模拟环境过程中,总之作为一名合格的数据库管理员,你应该做好接受各种数据导入请求的技术储备,同时还要尽量满足人本能的对导入速度的苛求.本文仅针对 Oracle 数据库所提供的加速数据导入的各种特性和技术进行探讨,其中的一些方法也可以转化应用于其他数据库.以下七种数据导入方法哪个最适用需要针对具体情况具体分析,我也附带列举了影

使用SQLServer 2008的CDC功能实现数据变更捕获

原文:使用SQLServer 2008的CDC功能实现数据变更捕获 最近由于工作需要,研究了一下2008 CDC功能,觉得还不错,下面整理了一下研究过程,虽然比较粗略,但是基本上能用了,如果有补充请大家回复,我视情况修改原帖,谢谢. 背景: 在SQLServer2008之前,对数据变更的捕获通常使用触发器.时间戳等低效高成本的功能来实现,所以很多系统都没有做数据变更或者仅仅对核心表做监控. 自从SQLServer2008引入了数据变更捕获功能(后面简称为CDC)后,解决了很多烦恼问题,如客户2个

SQLServer 2008 CDC功能实现数据变更捕获脚本_MsSql

CDC:Change Data Capture 复制代码 代码如下: --步骤:本文中以GPOSDB为例 --第一步.对目标库显式启用CDC:--在当前库使用sys.sp_cdc_enable_db.返回0(成功)或1(失败).--注意,无法对系统数据库和分发数据库启用该功能.且执行者需要用sysadmin角色权限.--该存储过程的作用域是整个目标库.包含元数据.DDL触发器.cdc架构和cdc用户.--使用以下代码启用:USE GPOSDB  --要启用CDC的数据库GOEXECUTE sys

《DNS与BIND(第5版)》——7.2 更新区域数据文件

7.2 更新区域数据文件 网络总是在不断变化的--新的工作站加入,老的被淘汰或卖掉,或者将主机移至另一个网络.每次改变都意味着区域数据文件必须跟着修改.应该手动修改这些文件还是应该使用工具协助修改呢? 本节将首先讨论如何手动修改区域数据文件.然后再介绍一个协助修改的工具:h2n.事实上,本书推荐使用工具来创建区域数据文件:或者至少使用工具来增加序号.区域数据文件的语法很容易导致错误.因为它无法保证存放在不同文件中的地址和指针记录,能够保持彼此之间的一致性.不过,就算是使用工具,也还是必须知道更新

logminer恢复误覆盖更新的数据

昨日程序部署人员在运营数据库误更新覆盖了系统重要数据.具体误操作方式在一表上用A字段和 B字段数据基本相同,但B字段中有null值,然后B字段的数据更新了A字段数据,之后删除了B字段, 导致系统重要入口数据无法显示,考虑表结构修改过,且只对单表操作,为尽快恢复数据,因此, 使用logminer读取日志的方式恢复数据.具体模拟相应场景 alter database archivelog; alter database open; 一 建立环境 1 建新表并插入数据 create table TES

SQLServer 2008 CDC功能实现数据变更捕获脚本

CDC:Change Data Capture复制代码 代码如下:--步骤:本文中以GPOSDB为例 --第一步.对目标库显式启用CDC:--在当前库使用sys.sp_cdc_enable_db.返回0(成功)或1(失败).--注意,无法对系统数据库和分发数据库启用该功能.且执行者需要用sysadmin角色权限.--该存储过程的作用域是整个目标库.包含元数据.DDL触发器.cdc架构和cdc用户.--使用以下代码启用:USE GPOSDB  --要启用CDC的数据库GOEXECUTE sys.s

如何在SSIS 2012中使用数据变更捕获

最新项目稍有空隙,开始研究SQL Server 2012和2014的一些BI特性,参照(Matt)的一个示例,我们开始体验SSIS中的CDC(Change Data Capture,变更数据捕获). 注:如果需要了解关于SQL Server 2008中的CDC,请看这里http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html),本文假定读者对CDC的工作方式已有所了解.^_^. 我们分三步完成实例: 1.准备基础数据: 2.设