Ok, I modified MT0's recursive CTE answer from the link above to handle two delimiters (ie, on both ends), and to pull out the delimiter into a separate column. Let me know if you have any questions.
with example as (select 1 as id, '#123##456##789#*0123*' as str from dual
union select 2, '#837#*827*#3021#*013*' from dual),
t ( id, str, start_pos, end_pos ) AS
( SELECT id, str, 1, REGEXP_INSTR( str, '[^0-9]' ) FROM example
UNION ALL
SELECT id,
str,
end_pos + 1,
REGEXP_INSTR( str, '[^0-9]', end_pos + 1 )
FROM t
WHERE end_pos > 0
)
SELECT id,
--str, start_pos, end_pos, -- uncomment for debugging
SUBSTR( str, start_pos, DECODE( end_pos, 0, LENGTH( str ) + 1, end_pos ) - start_pos ) AS value,
substr(str, start_pos-1, 1) as type
FROM t
where start_pos <> end_pos and end_pos <> 0
-- bonus question - uncomment to filter by ID
--and id = 1
ORDER BY id,
start_pos;
FYI - this will drop null values (eg "##") and not display them as a row.