This is actually prettier and more elegant than I usually get for PL/SQL. :) The routine relies on a function
betwnstr, which you may find in Feuerstein and Pribyl's Oracle PL/SQL Programming from O'Reilly, 3rd edition, page 216, or implement yourself. Incidentally, one bug I had along the way was using SUBSTR here without thinking about what I really wanted to do.
Generalizing to take any arbitrary character to split on as a parameter is left as an exercise to the reader. As is generalizing to take any arbitrary string, followed by generalizing to take any arbitrary regular expression.
FUNCTION comma_split(p_text VARCHAR2)
RETURN OWA_TEXT.VC_ARR
IS
v_array OWA_TEXT.VC_ARR;
v_lastpos INTEGER := 0;
v_pos INTEGER;
v_count INTEGER := 0;
BEGIN
WHILE v_lastpos <= LENGTH(p_text)
LOOP
v_count := v_count + 1;
v_pos := INSTR(p_text, ',', 1, v_count);
IF v_pos = 0
THEN
v_pos := LENGTH(p_text) + 1;
END IF;
v_array(v_count) := betwnstr(p_text, v_lastpos + 1, v_pos - 1);
v_lastpos := v_pos;
END LOOP;
RETURN v_array;
END comma_split;