Прежде всего, я бы предложил представлять результат в строках, а не в столбцах, потому что в последнем случае вам нужно знать количество столбцов для построения запроса или использовать динамический SQL, который является более сложным и абсолютно избыточным в ваш случай.
Попробуйте это:
with t as (select '231/19/2812-27/1' as str from dual)
select regexp_substr(str,'[^/]+',1,level) as val
from t
connect by regexp_substr(str,'[^/]+',1,level) is not null
Да, это регулярное выражение и, на мой взгляд, самый простой способ достичь желаемого результата. Если вы не хотите использовать это, напишите свою собственную функцию для разбиения строки.
Но, если вы все еще хотите представить свой результат в столбцах, попробуйте следующее:
--edit removed a , at the end
SELECT REGEXP_SUBSTR(t.value, '[^/]+', 1, 1) col1,
REGEXP_SUBSTR(t.value, '[^/]+', 1, 2) col2,
REGEXP_SUBSTR(t.value, '[^/]+', 1, 3) col3,
REGEXP_SUBSTR(t.value, '[^/]+', 1, 4) col4
FROM (select '231/19/2812-27/1' as value from dual) t;