O terceiro parâmetro da função REGEXP_SUBSTR indica a posição na string alvo (
de_desc
no seu exemplo) onde você deseja começar a pesquisar. Supondo que uma correspondência seja encontrada na parte especificada da string, isso não afeta o que é retornado. No Oracle 11g, há um sexto parâmetro para a função, que acho que é o que você está tentando usar, que indica o grupo de captura que você deseja que seja retornado. Um exemplo de uso adequado seria:
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
Onde o último parâmetro
1
indique o número do grupo de captura que você deseja retornar. Aqui está um link para a documentação que descreve o parâmetro. 10g parece não ter essa opção, mas no seu caso você pode conseguir o mesmo resultado com:
select substr( match, 2, length(match)-2 ) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
);
já que você sabe que uma correspondência terá exatamente um caractere em excesso no início e no final. (Como alternativa, você pode usar RTRIM e LTRIM para remover colchetes de ambas as extremidades do resultado.)