Что-то не так у вас в логах c. Вам не нужно преобразовывать строки в строки. Итак, я думаю:
SELECT LAST_DAY(TO_DATE('01' || :P_MONTH || '2020', 'DDMMYYYY'))
FROM DUAL
Шаблон MM
ищет числовой месяц. (У вас также есть шаблон формата 'DDMMYYYY'
дважды в вашем запросе; я не уверен, почему.)
Так получилось, что Oracle по умолчанию устанавливает год на текущий год и день месяца на текущий месяц. Таким образом, вам даже не нужно возиться со строками:
SELECT LAST_DAY(TO_DATE(:P_MONTH , 'MM'))
FROM DUAL;
Вышеупомянутое предполагает числовое значение для вашего параметра. Если вы хотите обработать строку, тогда:
SELECT LAST_DAY(TO_DATE('01' || :P_MONTH || '2020', 'DDMONYYYY'))
FROM DUAL
Или:
SELECT LAST_DAY(TO_DATE(:P_MONTH , 'MON'))
FROM DUAL;
Если вы хотите передать полное название месяца, используйте MONTH
вместо MON
.