El tercer parámetro de la función REGEXP_SUBSTR indica la posición en la cadena de destino (de_desc
en su ejemplo) donde desea comenzar a buscar. Suponiendo que se encuentra una coincidencia en la parte dada de la cadena, no afecta lo que se devuelve.
En Oracle 11g, hay un sexto parámetro para la función, que creo que es lo que está tratando de usar, que indica el grupo de captura que desea devolver. Un ejemplo de uso adecuado sería:
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
Donde el último parámetro 1
indique el número del grupo de captura que desea devolver. Aquí hay un enlace a la documentación que describe el parámetro.
10g no parece tener esta opción, pero en tu caso puedes lograr el mismo resultado con:
select substr( match, 2, length(match)-2 ) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
);
ya que sabe que una coincidencia tendrá exactamente un carácter de exceso al principio y al final. (Alternativamente, podría usar RTRIM y LTRIM para eliminar corchetes de ambos extremos del resultado).