This is a simple function which parses a delimiter-seperated string (varchar2 or clob) and returns a string array.
1. Create the string array type
2. Create a package with two functions
FUNCTION Split(sText IN VARCHAR2, sDel IN VARCHAR2 := ‘,’) RETURN str_array;
FUNCTION Split(sText IN clob, sDel IN VARCHAR2 := ‘,’) RETURN str_array;
END Str;
FUNCTION Split(sText IN VARCHAR2, sDel IN VARCHAR2 := ‘,’) RETURN str_array IS
nStartIdx PLS_INTEGER := 1;
nEndIdx PLS_INTEGER := 1;
oRet str_array := str_array();
BEGIN
IF sText IS NULL THEN RETURN oRet; END IF;
nEndIdx := INSTR(sText, sDel, nStartIdx);
oRet.Extend;
oRet(oRet.LAST) := SUBSTR(sText, nStartIdx, nEndIdx – nStartIdx);
nStartIdx := nEndIdx + 1;
oRet.Extend;
oRet(oRet.LAST) := SUBSTR(sText, nStartIdx);
EXIT;
RETURN oRet;
END Split;
FUNCTION Split(sText IN clob, sDel IN VARCHAR2 := ‘,’) RETURN str_array IS
nStartIdx PLS_INTEGER := 1;
nEndIdx PLS_INTEGER := 1;
oRet str_array := str_array();
BEGIN
IF sText IS NULL THEN RETURN oRet; END IF;
IF DBMS_LOB.getlength(sText) = 0 THEN RETURN oRet; END IF;
nEndIdx := DBMS_LOB.INSTR(sText, sDel, nStartIdx);
oRet.Extend;
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, nEndIdx – nStartIdx, nStartIdx);
nStartIdx := nEndIdx + LENGTH(sDel);
oRet.Extend;
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(lob_loc => sText, offset => nStartIdx);
EXIT;
RETURN oRet;
END Split;
END Str;
3. Test it