Você pode usar
SUBSTR
e INSTR
:select substr('john.abc_1234', 1, instr('john.abc_1234', '_') -1)
from dual
Atualizar
Além disso, se você estiver executando a partir do Oracle 10g, poderá usar o caminho Regex, que lidaria com exceções com mais eficiência.
Aqui estão alguns links sobre como fazer isso no Oracle:
- http://psoug.org/reference/regexp.html
- http://psoug.org/snippet/Regular -Expressões--Regexp-Cheat-Sheet_856.htm
- http://www.regular-expressions.info/oracle.html