Maybe this is what you want to get:
with cols as (select 'Select 1,2,3 from dual' query from dual)
select count(regexp_substr (query,'[^,]+',1,level)) columns
from cols connect by level <= length(query) - length(replace(query, ',')) + 1;
COLUMNS
----------
3