Ошибка оракула недопустимого месяца
Обновлено: 21.11.2024
Сегодня я хотел бы написать о небольшой проблеме, которая может вызвать серьезные проблемы в Oracle 19c. Эта запись в блоге посвящена ловушке: ORA-1843 — НЕДЕЙСТВИТЕЛЬНЫЙ МЕСЯЦ в Oracle 19.4–19.8.
" data-medium-file="https://i0.wp.com/mikedietrichde.com/wp-content/uploads/2020/08/ora-1843.jpg?fit=300%2C121&ssl=1" данные -large-file="https://i0.wp.com/mikedietrichde.com/wp-content/uploads/2020/08/ora-1843.jpg?fit=740%2C297&ssl=1" src="https:/ /i0.wp.com/mikedietrichde.com/wp-content/uploads/2020/08/ora-1843.jpg?resize=740%2C297&ssl=1" alt="Подводный камень: ORA-1843 - НЕДЕЙСТВИТЕЛЬНЫЙ МЕСЯЦ в Oracle 19,4 - 19,8" ширина = "740" высота = "297" srcset = "https://i0.wp.com/mikedietrichde.com/wp-content/uploads/2020/08/ora-1843.jpg?w=1200&ssl" =1 1200 Вт, https://i0.wp.com/mikedietrichde.com/wp-content/uploads/2020/08/ora-1843.jpg?resize=300%2C121&ssl=1 300 Вт, https://i0.wp .com/mikedietrichde.com/wp-content/uploads/2020/08/ora-1843.jpg?resize=1024%2C411&ssl=1 1024w, https://i0.wp.com/mikedietrichde.com/wp-content/ uploads/2020/08/ora-1843.jpg?resize=768%2C308&ssl=1 768w" size="(max-width: 740px) 100vw, 740px" data-recalc-dims="1" />
Тестовый пример
Мой тестовый пример очень прост — и вы можете воспроизвести его даже без каких-либо объектов за 2 секунды (один для «копировать», другой для «вставить»). . Просто выполните этот запрос:
Или этот, где я заменил "RR" на более распространенное "YY":
Результат в Oracle 11.2, 12.1, 12.2.0.1 и 18c
Я выполняю этот тест в версии 12.2.0.1 и ожидаемый результат:
Результат в Oracle 19.4, 19.5, 19.6, 19.7 и 19.8
А теперь я повторяю тот же тест в Oracle 19c, в моем случае в 19.8.0:
Не хорошо. И не ожидалось.
Общая информация
При поиске в MOS с "ORA-1843 недопустимый месяц до_даты" первым результатом будет это примечание:
И там вы также найдете номер ошибки, но ошибка не является общедоступной, поэтому ссылка не добавлена:
- Ошибка 30565805 — ORA-01843: НЕДЕЙСТВИТЕЛЬНЫЙ МЕСЯЦ ПРИ ВЫПОЛНЕНИИ TO_DATE('20191120','RRMMDD')
Проблема возникла как регрессия исправления ошибки 28509578.
Решение
Что мне совсем не нравится в последних заметках MOS, так это предложение в качестве предлагаемого решения:
Сначала Oracle 20c недоступен локально. И, кроме того, примечания к выпуску Oracle 20c говорят вам в заголовке на странице 1:
Oracle Database 20c доступен только для предварительной версии. Он недоступен для производственного использования. Обновление до или с Oracle Database 20c не поддерживается.
Мне нужна ваша помощь в устранении ошибки ORA-01843: неверный месяц.
Когда я использую приведенный ниже код
выбрать число(*) из
где (round(SYSDATE - to_date(LAST_UPDATE_DATE,'DD-MM-YYYY:hh24:mi:ss'),2)) > 2.1;
Я получаю сообщение об ошибке ORA-01843: неверный месяц
тогда как я использую
выберите (круглый(SYSDATE - to_date(LAST_UPDATE_DATE,'ДД-ММ-ГГГГ:чч24:ми:сс'),2)) из
где (round(SYSDATE - to_date(LAST_UPDATE_DATE,'DD-MM-YYYY:hh24:mi:ss'),2)) > 2,1
Я могу получить такие записи, как
Почему я получаю сообщение ORA-01843: неверный месяц? Как это исправить?
Любая помощь в этом будет очень полезна.
С уважением,
Саумьядип.
Лучшие ответы
Каково определение столбца LAST_UPDATE_DATE? Это DATE или что-то вроде VARCHAR?
Если это дата, когда вы получаете неявное преобразование в varchar, это может привести к ошибке.
Если это varchar, вы должны проверить содержимое столбца.
LAST_UPDATE_DATE — это столбец даты, или я бы сказал, что он фиксирует системную дату через триггер.
Это не говорит нам о типе данных столбца. Кажется, вы говорите, что это «дата», но затем ваш комментарий звучит так, будто вы используете «дату» в том, как вы используете столбец, а не обязательно его тип данных.
Если LAST_UPDATE_DATE имеет тип DATE, то вам не следует применять к нему TO_DATE(). TO_DATE() принимает на вход строку. Использование TO_DATE для типа DATE просто заставляет оракул преобразовать входную DATE в STRING, используя значение NLS_DATE_FORMAT. Результат может соответствовать или не соответствовать маске формата, которую вы указали для TO_DATE.
С другой стороны, если LAST_UPDATE_DATE любого типа, отличного от DATE, то у вас очень серьезный недостаток дизайна.
Мне нужна ваша помощь в устранении ошибки ORA-01843: неверный месяц.
Когда я использую приведенный ниже код
выбрать число(*) из
Я получаю сообщение об ошибке ORA-01843: неверный месяц
тогда как я использую
Я могу получить такие записи, как
Почему я получаю сообщение ORA-01843: неверный месяц? Как это исправить?
Любая помощь в этом будет очень полезна.
Какой инструмент вы используете? Если вы используете инструменты с графическим интерфейсом, такие как SQL Developer, Toad, SQL * Navigator и т. Д., Все они извлекают только первый экран строк результатов. Поэтому, если какая-то строка в вашей таблице имеет неверное значение, SELECT COUNT(*) завершится ошибкой, но SELECT (round(SYSDATE - to_date(LAST_UPDATE_DATE,'DD-MM-YYYY:hh24:mi:ss'),2)) с использованием инструментов, которые выборка экрана за экраном не может, так как forst secreen еще не попал в эту плохую строку. Проблема:
И всех этих проблем можно было бы избежать, если бы вы хранили даты как DATE, а не как VARCHAR2/CHAR.
Решение ORA-01843 включает проблемы с неверными данными. Причина возникновения ORA-01843 включает следующие причины
- Использование неправильного NLS_DATE_FORMAT
Это часто случается, когда вы видите данные, поступающие из США,
(где месяц обычно пишется перед днем)
но формат в приложении по-прежнему "европейский".
(где день пишется перед месяцем).
- Использование неправильного NLS_DATE_FORMAT:
например, попытка вставить "письменное" название месяца, но в маске используется "числовой" месяц.
Ошибка "ORA-01843: недопустимый месяц" не является "проблемой оракула", а, скорее всего, вызвана тем, что в коде не определены правильные маски дат или используются неверные значения по умолчанию."
Также важно помнить, что ORA-01843 не всегда генерируется, даже если есть неверные данные.
(Вы можете просмотреть документацию MOSC (идентификатор документа: примечание: 338832.1) для получения полной информации об отладке ORA-01843.)
Бурлесон — американская команда
Примечание. Эта документация по Oracle была создана в качестве справочника по поддержке и обучению Oracle для использования нашими специалистами-консультантами по настройке производительности администраторов баз данных. Не стесняйтесь задавать вопросы на нашем форуме Oracle.
Проверьте опыт! Любой, кто рассматривает возможность использования услуг эксперта службы поддержки Oracle, должен самостоятельно проверить свои полномочия и опыт, а не полагаться на рекламу и самопровозглашенный опыт. Все законные эксперты Oracle публикуют свои квалификации Oracle.
Ошибки? Технология Oracle меняется, и мы стараемся обновлять нашу информацию о поддержке BC Oracle. Если вы обнаружите ошибку или у вас есть предложение по улучшению нашего контента, мы будем признательны за ваш отзыв. Просто электронная почта:
и укажите URL-адрес страницы.
Burleson Consulting
Оракул поддержки баз данных
При работе с базой данных Oracle сталкивались ли вы с какой-либо ошибкой, обозначенной как ORA-01843: ошибка недопустимого месяца? Вы ищете способы исправить ошибку недействительного месяца? Если да, то хотите ли вы знать, как устранить ошибку недействительного месяца в оракуле? Да, здесь, в этом блоге, я поделюсь наиболее эффективными методами, которые можно попробовать исправить ORA-01843: неверная ошибка мотылька.
Итак, не ждите ничего, давайте начнем с введения этой ошибки, ее причин и, очевидно, исправлений для устранения ошибки ora-01843.
Что такое ORA-01843: недопустимая ошибка мотылька?
Обычно пользователи получают эту ошибку, когда механизм SQL не может распознать значение месяца во входной строке. Ошибка ORA-01843 в Oracle представляет собой недопустимую ошибку месяца, которая очень распространена и встречается при работе с переменными типа данных, например TO_DATE. Функция TO_DATE в Oracle должна преобразовывать ввод в значение DATE. Но иногда возникает какая-то проблема, из-за которой это мешает вам это сделать.
Правильный синтаксис функции TO_DATE выглядит следующим образом:
TO_DATE(string1, [format_mask], [nls_language])
Здесь первым параметром является входная строка, и это единственное обязательное поле. И второй параметр обозначает маску формата входного значения, однако третий параметр — это язык значения данных.
Существует несколько основных причин, из-за которых вы получаете сообщение об ошибке ORA-01843 о недопустимом месяце в Oracle. Ниже мы обсудим это…..
Причины ORA-01843: неверный месяц
Вызов ora-01843 вызван двумя основными причинами: ошибка недопустимого месяца, которая упоминается ниже:
- Введенная дата не соответствует формату даты базы данных, указанному в переменной NLS_DATE_FORMAT.
- Введенное значение месяца в формате даты не соответствует допустимому месяцу.Это означает, что значение месяца не находится в диапазоне от января до декабря или от 01 до 12.
Как устранить ошибку «Неверный месяц» в Oracle?
Вполне возможно, что вы обнаружите, что в вашем месячном значении нет ничего плохого, однако используемое вами месячное значение может быть неприемлемо для Oracle. Например:
Давайте сначала переключим NLS_DATE_LANGUAGE на ЯПОНСКИЙ
Код должен быть:
SQL> изменить набор сеансов nls_date_language=’Japanese’;
Сеанс изменен.
Далее мы использовали термин 八月, который также означает август на японском языке.
SQL> выберите TO_DATE(‘八月 30, 2019’, ‘Month dd, YYYY’) из двойного;
выберите TO_DATE('八月 30, 2019', 'Месяц дд, ГГГГ') из двойного
*
ОШИБКА в строке 1:
ORA-01843: недопустимый месяц
Теперь возникает вопрос, где найти правильное значение месяца…
Как я уже упоминал, «八月» также является правильным выражением месяца «август» в японском языке, но оно совершенно недействительно в Oracle.
Решение этой проблемы
Чтобы устранить эту ошибку, очень важно знать правильные и допустимые значения месяца для разных NLS_DATE_LANGUAGE. Что ж, в этом случае «八月» не является допустимым значением, но «8月» является допустимым значением для месяца. Код должен быть записан так:
SQL> выберите TO_DATE(‘8–30 месяцев 2019 года, ‘месяц дд, ГГГГ’) из двойного;
30-8 月 -19
При использовании базы данных Oracle в операторе могут быть типы, как в приведенном ниже примере:
[oracle@test ~]$ export NLS_LANG=.UTF8
[oracle@test ~]$ sqlplus /nolog
…
SQL> conn hr/hr
Подключено.
SQL> установить курс;
SQL> выберите значение из v$nls_parameters, где параметр = ‘NLS_DATE_LANGUAGE’;AMERICANSQL> выберите TO_DATE («30 августа 2019 г.», «Месяц дд, ГГГГ») из двойного;
выберите TO_DATE('30 августа 2019', 'Месяц дд, ГГГГ') из двойного
*
ОШИБКА в строке 1:
ORA-01843: неверный месяц< /p>цитата>Здесь, в приведенном выше коде примера TO_DATE, есть ошибка в написании «Август», поэтому механизм SQL не может распознать значение месяца. В этом случае решение настолько простое, что вам просто нужно проверить правописание и исправить его тут же.
Решение этой проблемы
Если все в порядке, то причина возникновения этой ошибки может заключаться в том, что вы должны вставить входную строку в текстовый редактор, а затем запустить проверку орфографии. Как, например, плагины для проверки орфографии, которые пользователи использовали для проверки правописания в Notepad++.
В приведенном выше примере TO_DATE мы неправильно написали «Август» как другое, поэтому механизм SQL не может распознать значение месяца. Решение простое, проверьте правильность написания и исправьте его.
Если вы не нашли ничего неправильного, возможно, вам следует вставить введенную строку в текстовый редактор и запустить проверку орфографии. Например, плагины для проверки орфографии Notepad++.
SQL> выберите TO_DATE('30 августа 2019 г.', 'Месяц дд, ГГГГ') из двойного;
30-AUG-19
Иногда по какой-то причине вы можете использовать иностранное значение месяца в операторе, подобном приведенному ниже коду:
SQL> выберите TO_DATE('Août 30, 2019', 'Month dd, YYYY') из двойного;
выберите TO_DATE('Août 30, 2019', 'Month dd, YYYY') из двойного
*
ОШИБКА в строке 1:
ORA-01843: неверный месяц< /p>Теперь, при текущем языке, т. е. NLS_DATE_LANGUAGE, механизм SQL не знает, что здесь означает Août? Здесь вы должны сказать, как это перевести, просто добавив опцию параметра NLS. Однако здесь возникает другой вопрос – на какой язык следует переводить?
Решение этой проблемы
Чтобы узнать, какой NLS_DATE_LANGUAGE следует использовать для перевода строки, необходимо проверить допустимые значения месяца для разных языков. Однако Août по-французски означает август. Итак, код должен быть написан так:
SQL> выберите TO_DATE('Août 30, 2019', 'Month dd, YYYY', 'NLS_DATE_LANGUAGE=FRENCH') из двойного;
30-8月-19
цитата>Пожалуйста, убедитесь, что вы использовали очень распространенный английский термин, обозначающий август в заявлении, здесь вам все равно придется переводить август в японской среде, когда вы получите сообщение ORA-01843: недопустимая ошибка месяца.
SQL> выберите TO_DATE('30 августа 2019', 'Месяц дд, ГГГГ', 'NLS_DATE_LANGUAGE=AMERICAN') из двойного;
30-8月-19
цитата>Оптимальное решение: попробуйте Oracle File Repair Tool, чтобы устранить ошибку, связанную с недопустимым месяцем
Чтобы узнать, как устранить недопустимую ошибку мотылька в Oracle, вы можете использовать Oracle File Repair Tool. Если после использования всех упомянутых выше способов исправить ошибку ora-01843 вы по-прежнему безуспешны, вам следует попробовать этот инструмент восстановления. Этот инструмент имеет возможность исправить ошибку недействительного месяца в оракуле.Этот инструмент имеет несколько замечательных функций, которые позволяют пользователям исправлять любые ошибки, возникающие при использовании базы данных Oracle, и легко восстанавливать базу данных.
Шаги по устранению ошибки «Недействительный месяц»
Шаг 1. Найдите на начальном экране Stellar Phoenix Oracle Recovery всплывающее окно с параметрами для выбора или поиска поврежденных баз данных Oracle на вашем компьютере.
Шаг 2. Нажмите «Сканировать файл», чтобы начать процесс сканирования после выбора базы данных Oracle. Восстанавливаемые объекты базы данных отображаются на левой панели.
Шаг 3. Щелкните объект, чтобы просмотреть его предварительный просмотр.
Шаг 4. Нажмите «Начать восстановление» на панели значков, чтобы начать процесс восстановления. Отображается всплывающее окно, в котором показаны шаги, необходимые для дальнейшего выполнения. Нажмите «Далее» и продолжите.
Шаг 5. Укажите имя пользователя, пароль и путь к пустой базе данных, в которой вы хотите сохранить восстановленные объекты базы данных.
Шаг 6. Исправление и восстановление различных объектов базы данных после установления соединения с пустой базой данных Oracle.
Вердикт
При использовании базы данных Oracle пользователи могут столкнуться с несколькими ошибками. ORA-01843: одна из них — ошибка неверного месяца. Здесь я изо всех сил старался предоставить вам способы узнать, как устранить ошибку недопустимого месяца в оракуле. Все это очень легко применять, и для применения этих решений вам просто нужны базовые знания базы данных Oracle. Итак, попробуйте эти исправления и легко и быстро восстановите файл базы данных Oracle.
Читайте также: