1 建表
create table tab_split_rowid
(
ROWID_MIN VARCHAR2(100),
ROWID_MAX VARCHAR2(100),
HAS_DEAL NUMBER
);
2 分片
delete from tab_split_rowid ;
commit;
insert into tab_split_rowid
select ora_rowid,lead(ora_rowid, 1) over(order by rn asc),0
from (
with cnt as (select count(*) from T_CZRZ where 1=1) -- 按需添加
where 条件 (希望仅针对存有满足 o 条件数据的范围 rowid 分块,o 要有索引) 注意替换这里!!
select rn, ora_rowid
from (select rownum rn, ora_rowid
from (select rowid ora_rowid
from T_CZRZ where 1=1 -- 按需添加 where 条件 (希望
仅针对存有满足 o 条件数据的范围 rowid 分块,o 要有索引) 注意替换这里!!
order by rowid))
where rn in (select (rownum - 1) *
trunc((select * from cnt) / &row_range) + 1
from dba_tables
where rownum < &row_range --输入分区的数目,需输入两次
相同的 row_range
union
select * from cnt));
3 处理
------
CREATE OR REPLACE PROCEDURE PROC_SPLIT_ROWID ( N NUMBER ) IS
V_SQLERRM VARCHAR2 ( 200 );
sqlStr VARCHAR2(4000);
BEGIN
FOR C IN ( SELECT ROWID_MIN, ROWID_MAX FROM tab_split_rowid WHERE
HAS_DEAL = 0 AND MOD( ID, 12 ) = N )
LOOP
INSERT /*+APPEND */ INTO new_table SELECT
col --具体字段名
FROM base_table t
WHERE ROWID >= CHARTOROWID( C.ROWID_MIN ) AND ROWID <=
CHARTOROWID( C.ROWID_MAX );
/*sqlStr :='INSERT /*+APPEND */ INTO new_table SELECT col /*具体字段名*/
FROM base_table t WHERE col_idx>:3 and ROWID between=:1 and bb=:2';
EXECUTE IMMEDIATE sqlStr USING para1,para2;*/
UPDATE tab_split_rowid SET HAS_DEAL = 1 WHERE ID = C.ID;
COMMIT;
END LOOP;
COMMIT;
EXCEPTION
评论