REGEXP_SUBSTR ne renvoie qu'une seule valeur. Vous pouvez transformer votre chaîne en une pseudo-table, puis interroger celle-ci pour les correspondances. Il existe une méthode basée sur XML qui m'échappe pour le moment, mais l'utilisation de la connexion fonctionne, tant que vous n'avez qu'une seule chaîne source :
SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
FROM (
SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1;
... vous donne :
SUBSTR
--------------------
Txa233141b
Ta233141
Ta233142
Ta233147
Ta233148
... et vous pouvez filtrer cela avec une version légèrement plus simple de votre motif d'origine :
SELECT substr
FROM (
SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
FROM (
SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str
FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1
)
WHERE REGEXP_LIKE(substr, '^[A-Za-z]{2}[0-9]{5,}$');
SUBSTR
--------------------
Ta233141
Ta233142
Ta233147
Ta233148
Ce qui n'est pas très joli, mais ne contient pas non plus plusieurs valeurs dans un champ.