Por lo que te he entendido, te da igual, que sea una cadena o una serie de registros.
La opción que pusiste, entiendo que te serviría salvo que sobrarían los valores, que determinan la longitud de la cadena, aunque si lo estás planteando es porque no puedes evitar tenerlas y supongo, que tampoco podrás incluir otro caracter especial por ejemplo un '|', para delimitar registros. La verdad es que es una información redundante, ya que los asteríscos ya determina el principio y fin.
Meter mano a la expresión regular lo veo complicado.
Yo la opción que se me ocurre es hacer una función PL/SQL, para limpiar la cadena previamente.
Código SQL:
Ver originalSELECT LEVEL,
regexp_substr(fn_limpia_cadena('2*C29*ABCDEB_349*ABCDIB_352*N 221*ABCDEFGHIJ KL MNONICO0*2*O212*AAAAAAAAAAAA22*ARBCPRTVNSTUN CRBVGYYHS'),'[^*]+', 1, level)
FROM dual
CONNECT BY LEVEL <= REGEXP_COUNT(fn_limpia_cadena('2*C29*ABCDEB_349*ABCDIB_352*N221*ABC DEFGHIJ KL MNONICO0*2*O212*AAAAAAAAAAAA22*ARBCPRTVNSTUN CRBVGYYHS'),'[^*]+');
Siendo fn_limpia_cadena una función que recibe como parámetro la cadena inicial y quitaría las longitudes de las cadenas.
Para ello recorrería con un bloque WHILE e iría mediante funciones substr e instr por un lado descomponiendo la cadena y por otro componiendo el resultado de la función.
No se a lo mejor a alguien se le ocurre alguna opción mejor.
Un saludo