REGEXP_SUBSTR может работать (версия 11g):
SELECT REGEXP_SUBSTR('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)(\d+)',1,1,'i',2) num
FROM dual;
Проверка ваших образцов данных:
SQL> SELECT REGEXP_SUBSTR('D-3-J322P2342',''([A-Z]+-\d+-[A-Z]+)(\d+)',1,1,'i',2) num
2 FROM dual;
NUM
---
322
SQL>
Это будет принимать любую регистровую альфа-строку,сопровождаемый чертой, сопровождаемый одной или более цифрами, сопровождаемый чертой, сопровождаемый другой альфа-строкой в любом случае, затем Вашим интересующим числом.
В 10g REGEXP_REPLAC E, это битне так просто, так как они не добавляли возможность ссылаться на подвыражения до 11g:
SELECT REGEXP_SUBSTR(str,'\d+',1,1) NUM
FROM (SELECT REGEXP_REPLACE('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)','',1,1,'i') str
FROM dual);
Ваш пример данных:
SQL> SELECT REGEXP_SUBSTR(str,'\d+',1,1) NUM
2 FROM
(SELECT REGEXP_REPLACE('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)','',1,1,'i') str
3 FROM dual);
NUM
---
322