Verificando as explicações sobre a função TO_CHAR, percebi o seguinte detalhe, o qual sugiro uma revisão:
Nessa query (SELECT TO_CHAR(1234.123, '9999,999') FROM DUAL;), não temos o formato decimal de vírgula; mas sim, o formato de milhar com vírgula, onde a vírgula representa a separação do milhar. Por isso o número 1234.123, após aplicada a query, ficou sem as casas decimais e na parte inteira do número, foi incluída a vírugla (,), separando o milhar; resultando o número milhar no formato inglês (1,234), e sem o número decimal.
Se fosse aplicado (SELECT TO_CHAR(1234.123, '9999,999.999'), ficaria ( 1,234.123), ficando o número do milhar, com a vírugula (,) e o decimal, com ponto (.). E 3 espaços antes, já que transformando em um valor de texto, pelo formato teria 4 dígitos iniciais, nos dígitos correspondentes ao milhar da parte inteira do numero.
Se fosse colocado assim (SELECT TO_CHAR(7771234.123, '9999,999.999') FROM DUAL;), resultaria em ' 7771,234.123 e, (SELECT TO_CHAR(77771234.123, 'FM99999,999.999') FROM DUAL;) em '77771,234.123', retirando o espaço inicial devido ao parâmetro 'FM' e, (SELECT TO_CHAR(77771234.123, 'FM99,999,999.999') FROM DUAL;) em '77,771,234.123', com 2 vírgulas dos milhares e sem o espaço do dígito inicial.
Já assim (SELECT TO_CHAR(1234.123, '9999.999,999') FROM DUAL;), dá um erro; porque o número decimal não pode ter, após o seu terceiro dígito, uma vírgula que no caso representaria o milhar.
Isso tudo porque o oracle está configurado pro inglês.