I suspect you've taken a 1-row solution and tried to scale to multiple rows. The SQL
select regexp_substr (str, '[^,]+', 1, level) subs
from dual
connect by level <= length (regexp_replace (str, '[^,]+')) + 1
works for a single string (in a single row), but if you want to expand to an entire table, then
select regexp_substr (str, '[^,]+', 1, level) subs
from MY_TABLE
connect by level <= length (regexp_replace (str, '[^,]+')) + 1
does not work because now your connect-by will keep looping back through all of the rows almost endlessly. Hence your two hours
The fix is to alter the code to link for each primary key, eg
select id, regexp_substr (str, '[^,]+', 1, level) subs
from t
connect by level <= length (regexp_replace (str, '[^,]+')) + 1
and pk_col = prior pk_col
and prior sys_guid() is not null;
but you'll find this not scale particular well.
Take a read here for various solutions including benchmarks for larger volumes
https://stewashton.wordpress.com/2016/08/02/splitting-strings-proof/