I probably wouldn't do that way because you're now reading the entire partition.
I would look at perhaps just building chunks based on DBA_EXTENTS because assuming you're using dbms_parallel_execute to handle a large table (or partition), you'll have more than a single extent most of the time.
SQL>
SQL> create table t
2 partition by list( x )
3 ( partition p1 values (1) ,
4 partition p2 values (2) ,
5 partition p3 values (3) ,
6 partition p4 values (4) ,
7 partition p5 values (5) )
8 as
9 select a.*, mod(rownum,5)+1 as x
10 from all_objects a,
11 ( select 1 from dual connect by level <= 100 )
12 where rownum <=2000000;
Table created.
SQL>
SQL>
SQL> select o.data_object_id, e.relative_fno, e.block_id, e.blocks
2 from dba_extents e
3 , dba_objects o
4 where e.owner = o.owner
5 and e.segment_name = o.object_name
6 and nvl(e.partition_name, '"') = nvl(o.subobject_name, '"')
7 and e.segment_type = o.object_type
8 and e.segment_type in ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
9 and e.owner = user
10 and e.segment_name = 'T'
11 and e.partition_name = 'P1';
DATA_OBJECT_ID RELATIVE_FNO BLOCK_ID BLOCKS
-------------- ------------ ---------- ----------
115970 64 619392 1024
115970 64 624512 1024
115970 64 629632 1024
115970 64 634752 1024
115970 64 639872 1024
115970 64 645760 1024
115970 64 650880 1024
115970 64 656000 1024
8 rows selected.
SQL> select
2 dbms_rowid.rowid_create(
3 rowid_type=>1
4 ,object_number=>data_object_id
5 ,relative_fno=>relative_fno
6 ,block_number=>start_block_id
7 ,row_number=>0
8 ) start_rowid,
9 dbms_rowid.rowid_create(
10 rowid_type=>1
11 ,object_number=>data_object_id
12 ,relative_fno=>relative_fno
13 ,block_number=>end_block_id
14 ,row_number=>32767
15 ) end_rowid
16 from
17 (
18 select o.data_object_id, e.relative_fno, e.block_id start_block_id, e.block_id+e.blocks-1 end_block_id
19 from dba_extents e
20 , dba_objects o
21 where e.owner = o.owner
22 and e.segment_name = o.object_name
23 and nvl(e.partition_name, '"') = nvl(o.subobject_name, '"')
24 and e.segment_type = o.object_type
25 and e.segment_type in ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
26 and e.owner = user
27 and e.segment_name = 'T'
28 and e.partition_name = 'P1'
29 );
START_ROWID END_ROWID
------------------ ------------------
AAAcUCABAAACXOAAAA AAAcUCABAAACXd/H//
AAAcUCABAAACYeAAAA AAAcUCABAAACYt/H//
AAAcUCABAAACZuAAAA AAAcUCABAAACZ9/H//
AAAcUCABAAACa+AAAA AAAcUCABAAACbN/H//
AAAcUCABAAACcOAAAA AAAcUCABAAACcd/H//
AAAcUCABAAACdqAAAA AAAcUCABAAACd5/H//
AAAcUCABAAACe6AAAA AAAcUCABAAACfJ/H//
AAAcUCABAAACgKAAAA AAAcUCABAAACgZ/H//
8 rows selected.
SQL>