выглядит некрасиво, но работает:
select r
,substr(','||csv||',',
instr(','||csv||',',',',1,r)+1,
instr(','||csv||',',',',1,r+1)-instr(','||csv||',',',',1,r)-1) v
from (select '5,6,7a,8b,,bob' csv from dual)
,(select rownum r from dual connect by level <= 4000)
where instr(csv||',',',',1,r) > 0;
R V
= =
1 5
2 6
3 7a
4 8b
5
6 bob