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>
これは、大文字と小文字を問わない英字文字列、ダッシュ、1 つ以上の数字、ダッシュ、大文字と小文字を問わない別の英字文字列、そして対象の数字を受け入れます。
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