分段表rowid_通过rowid分批更新数据

本文介绍了在Oracle环境下,如何通过ROWID将数据分段并进行批量更新。首先创建了一个名为tb_my_objects的表,然后展示了如何获取表数据的起始和结束ROWID,并按照ROWID将数据分成多个批次。最后,给出了一段示例代码,演示了如何更新特定ROWID范围内的表数据。11G版本提供了dbms_parallel_execute包来更方便地处理这种分批数据操作。
摘要由CSDN通过智能技术生成

环境:

OS:Red Hat Linux As 5

DB:10.2.0.4

通常情况下我们更新数据量比较大的表的时候,通常会使用Oracle中Bulk Collect做批量更新,但我们按照表数据行的ROWID,按照ROWID将表数据分成几批,然后通过ROWID更新表的数据.

1.创建表

Create Table tb_my_objects

As

Select * From dba_objects;

2.获取表数据的起始ROWID和截止ROWID

Declare

l_Job Number;

Begin

dbms_output.put_line('Begin_Rowid'||'------------'||'End_Rowid');

For x In (Select Dbms_Rowid.Rowid_Create(1,

Data_Object_Id,

Lo_Fno,

Lo_Block,

0) Min_Rid,

Dbms_Rowid.Rowid_Create(1,

Data_Object_Id,

Hi_Fno,

Hi_Block,

10000) Max_Rid

From (Select Distinct Grp,

First_Value(Relative_Fno) Over(Partition By Grp Order By Relative_Fno, Block_Id Rows Between Unbounded Preceding And Unbounded Following) Lo_Fno,

First_Value(Block_Id) Over(Partition By Grp Order By Relative_Fno, Block_Id Rows Between Unbounded Preceding And Unbounded Following) Lo_Block,

Last_Value(Relative_Fno) Over(Partition By Grp Order By Relative_Fno, Block_Id Rows Between Unbounded Preceding And Unbounded Following) Hi_Fno,

Last_Value(Block_Id + Blocks - 1) Over(Partition By Grp Order By Relative_Fno, Block_Id Rows Between Unbounded Preceding And Unbounded Following) Hi_Block,

Sum(Blocks) Over(Partition By Grp) Sum_Blocks

From (Select Relative_Fno,

Block_Id,

Blocks,

Trunc((Sum(Blocks)

Over(Order By Relative_Fno, Block_Id) - 0.01) /

(Sum(Blocks) Over() / 8)) Grp

From Dba_Extents

Where Segment_Name = Upper('TB_MY_OBJECTS')

And Owner = User

Order By Block_Id)),

(Select Data_Object_Id

From User_Objects

Where Object_Name = Upper('TB_MY_OBJECTS'))) Loop

dbms_output.put_line(x.min_rid||'----'||x.max_rid);

End Loop;

End;

Begin_Rowid------------End_Rowid

AAAZWuAABAAAX8AAAA----AAAZWuAABAAAX9/CcQ

AAAZWuAABAAAYAAAAA----AAAZWuAABAAAYD/CcQ

AAAZWuAABAAAX0AAAA----AAAZWuAABAAAX1/CcQ

AAAZWuAABAAAX2AAAA----AAAZWuAABAAAX3/CcQ

AAAZWuAABAAAXuIAAA----AAAZWuAABAAAXyHCcQ

AAAZWuAABAAAX4AAAA----AAAZWuAABAAAX5/CcQ

AAAZWuAABAAAX+AAAA----AAAZWuAABAAAX//CcQ

AAAZWuAABAAAX6AAAA----AAAZWuAABAAAX7/CcQ

3.更新某个rowid范围的表数据(其他的做同样的操作)

Update tb_my_objects tt

Set tt.last_ddl_time=Sysdate

Where Rowid Between 'AAAZWuAABAAAX8AAAA' and 'AAAZWuAABAAAX9/CcQ';

说明:

11G已经提供了dbms_parallel_execute分批处理数据的过程.

-- The End --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值