É por causa da sua expressão regular. Altere para procurar apenas caracteres alfabéticos consecutivos:
select regexp_substr('abc
def
ghi', '[[:alpha:]]+', 1 ,level)
from dual
connect by regexp_substr('abc
def
ghi', '[[:alpha:]]+', 1 ,level) is not null
Funciona também para caracteres únicos:
select regexp_substr('a
b
c', '[[:alpha:]]+', 1 ,level)
from dual
connect by regexp_substr('a
b
c', '[[:alpha:]]+', 1 ,level) is not null;
Você comentou:
Por favor, sempre coloque todas as informações na pergunta para começar, por favor.
Você parece estar procurando dividir em um caractere de nova linha (retorno de carro ou retorno de carro/alimentação de linha)
Nesse caso, você deseja dividir onde algo não um desses personagens. Eu usei todos os caracteres de controle aqui porque sou preguiçoso, mas funcionará para os dados fornecidos. Se você tiver alguns caracteres de Bell, isso não funcionará, você terá que ser mais específico.
with the_data as (
select 'a
b
c' as dat
from dual
)
select regexp_substr(dat, '[^[:cntrl:]]+', 1 ,level)
from the_data
connect by regexp_substr(dat, '[^[:cntrl:]]+', 1 ,level) is not null;