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:
- https://psoug.org/reference/regexp.html
- https://psoug.org/snippet/Regular -Expressões--Regexp-Cheat-Sheet_856.htm
- https://www.regular-expressions.info/oracle.html