Пожалуйста, не мод-1, если я не прав. Я собираюсь из памяти, так что это отказ от ответственности, чтобы проверить.
TO_CHAR на самом деле отличается между SQL и PL / SQL.
В SQL TO_CHAR не принимает сырье, как вы узнали.
В PL / SQL To_CHAR будет принимать необработанное значение.
Так что, если вы все равно находитесь в процедуре, иногда проще использовать переменную, но если вы просто используете SQL, перейдите к другим ответам здесь.