Вот одно из решений.Он использует регулярные выражения для разделения слов из вашей строки на токены.Затем эти токены подсчитываются с помощью простой функции агрегирования.Таким образом, чистый SQL и отсутствие необходимости в ассоциативных массивах или любой другой коллекции PL / SQL.
with dat as (
select 'Hello, I like ham pizza more than mozzarella pizza.' as str from dual
) , tkns as (
select regexp_substr(str, '([[:alnum:]]+)', 1, level) as tkn
from dat
connect by level <= regexp_count(str, '[\., ]')
)
select tkn, count(*)
from tkns
where tkn is not null
group by tkn
order by tkn
/
Несомненно, существуют более элегантные решения регулярных выражений, но по крайней мере это работает.