Acompanhe a linha de raciocínio:
1. Vamos criar uma variavel "V" no sql*plus:
2. Setamos o valor que você quer nela:
Selecionar tudo
SQL> begin
2 :v := '1234X47545445X411245X1474125X2546';
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> print
V
---------------------------------------------------------
1234X47545445X411245X1474125X2546
SQL>
3. O Instr procura numa string uma outra (no caso, o X), e retorna a posição encontrada:
Selecionar tudo
SQL> select instr( :v , 'X' ) from dual;
INSTR(:V,'X')
-------------
5
4. Dá pra forçar ele a buscar A PARTIR de uma determinada posição! (no caso abaixo, a partir da 6 posição)
Selecionar tudo
SQL> select instr( :v , 'X', 6 ) from dual;
INSTR(:V,'X',6)
---------------
14
5. Pra terminar, ele busca de tras pra frente, mas daí tem que botar negativo!
Selecionar tudo
SQL> select instr( :v, 'X', -1 ) from dual;
INSTR(:V,'X',-1)
----------------
29
6. Com base nisso, fazemos o substr a partir dessa posição:
Selecionar tudo
SQL> select substr( :v, INSTR(:V,'X',-1) ) from dual;
SUBSTR(:V,INSTR(:V,'X',-1))
---------------------------------------------------------
X2546
SQL> select substr( :v, INSTR(:V,'X',-1)+1 ) from dual;
SUBSTR(:V,INSTR(:V,'X',-1)+1)
---------------------------------------------------------
2546
SQL>
OUTRAS REFERENCIAS:
http://glufke.net/oracle/viewtopic.php?t=753
http://glufke.net/oracle/viewtopic.php?t=3301