ORA-01555处理

有时表太大,导出时出现1555错误,可以采用分段方式处理。
以下原理也不是很清楚,先记录一下,再研究。
select dbms_rowid.rowid_create(1, oid1, fid1, bid1, 0) rowid1, 
       dbms_rowid.rowid_create(1, oid2, fid2, bid2, 9999) rowid2 
  from (select a.*, rownum rn 
          from (select chunk_no, 
                       min(oid1) oid1, 
                       max(oid2) oid2, 
                       min(fid1) fid1, 
                       max(fid2) fid2, 
                       min(bid1) bid1, 
                       max(bid2) bid2 
                  from (select chunk_no, 
                               FIRST_VALUE(data_object_id) OVER(PARTITION BY chunk_no ORDER BY data_object_id, relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) oid1, 
                               LAST_VALUE(data_object_id) OVER(PARTITION BY chunk_no ORDER BY data_object_id, relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) oid2, 
                               FIRST_VALUE(relative_fno) OVER(PARTITION BY chunk_no ORDER BY data_object_id, relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fid1, 
                               LAST_VALUE(relative_fno) OVER(PARTITION BY chunk_no ORDER BY data_object_id, relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) fid2, 
                               FIRST_VALUE(block_id) OVER(PARTITION BY chunk_no ORDER BY data_object_id, relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) bid1, 
                               LAST_VALUE(block_id + blocks - 1) OVER(PARTITION BY chunk_no ORDER BY data_object_id, relative_fno, block_id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) bid2 
                          from (select data_object_id, 
                                       relative_fno, 
                                       block_id, 
                                       blocks, 
                                       ceil(sum2 / chunk_size) chunk_no 
                                  from (select /*+ rule */ b.data_object_id, 
                                               a.relative_fno, 
                                               a.block_id, 
                                               a.blocks, 
                                               sum(a.blocks) over(order by b.data_object_id, a.relative_fno, a.block_id) sum2, 
                                               ceil(sum(a.blocks) 
                                                    over() / &trunks) chunk_size 
                                          from dba_extents a, dba_objects b 
                                         where a.owner = b.owner 
                                           and a.segment_name = b.object_name 
                                           and nvl(a.partition_name, '-1') = 
                                               nvl(b.subobject_name, '-1') 
                                           and b.data_object_id is not null 
                                           and a.owner = upper('&owner') 
                                           and a.segment_name = upper('&table_name')))) 
                 group by chunk_no 
                 order by chunk_no) a);

猜你喜欢

转载自aigo-h.iteye.com/blog/1945066
今日推荐