Try this method ...

drop table my_table;
create table my_table (my_section number,my_piece number,my_text varchar2(4));
insert into my_table values (1,1,'ABCD');
insert into my_table values (1,2,'E');
insert into my_table values (1,3,'FGH');
insert into my_table values (1,4,'IJK');
insert into my_table values (2,1,'LM');
insert into my_table values (2,2,'NOP');

select my_section,all_text from
(
select
my_section,
my_piece,
my_text||
lead(my_text,1) over (partition by my_section order by my_piece)||
lead(my_text,2) over (partition by my_section order by my_piece)||
lead(my_text,3) over (partition by my_section order by my_piece)||
lead(my_text,4) over (partition by my_section order by my_piece)||
lead(my_text,5) over (partition by my_section order by my_piece)||
lead(my_text,6) over (partition by my_section order by my_piece)||
lead(my_text,7) over (partition by my_section order by my_piece) all_text,
first_value(my_piece) over(partition by my_section) first_piece
from
my_table
)
where my_piece = first_piece
/

MY_SECTION ALL_TEXT
---------- --------------------------------
1 ABCDEFGHIJK
2 LMNOP

Like most SQL-based methodologies you have to code an upper limit on the number of strings you are going to concatenate, but it has the advantages of ...

i) not requiring PL/SQL
ii) being v. fast.