Oracle ORA-01805 на базе данных Oracle 11g
Наша база данных Oracle 10g была недавно обновлена до 11g. База данных работает на компьютере под управлением Windows Server 2003 X64. В запросах SQL из приложения.NET, которые обращаются к таблице, имеющей столбцы данных TIMESTAMP (6) WITH TIME ZONE, я получаю следующее исключение.
System.Data.OracleClient.OracleException: ORA-01805: возможная ошибка в операции даты / времени
Предлагаемое действие для исключения состоит в том, чтобы гарантировать, что клиент и сервер имеют одинаковую версию:
ORA-01805: возможная ошибка в работе даты / времени Причина: файлы часового пояса на клиенте и сервере не совпадают. Операция может потенциально привести к неверным результатам, основанным на файле местного часового пояса. Действие: Убедитесь, что версии часового пояса клиента и сервера совпадают.
Я выполнил следующие запросы, чтобы проверить часовой пояс в рассматриваемой базе данных. Я не нашел информации о том, как установить часовой пояс (или изменить файл часового пояса) для клиента.
SELECT dbtimezone FROM DUAL;
select * from v$timezone_file;
DBTIMEZONE
----------
+00:00
FILENAME VERSION
-------------------- ----------------------
timezlrg_14.dat 14
Я предполагаю, что клиент ссылается на Мгновенный клиент, который я установил, это версия 11_2? Я запускаю запросы через System.Data.OracleClient.OracleConnection
как предусмотрено.NET Framework. Пользовательский интерфейс предполагает, что "версия часового пояса" относится к версиям файла часового пояса. Я не вижу, где мгновенный клиент имеет файл часового пояса. Любые предложения оцениваются.
4 ответа
Используйте "genezi -v", чтобы узнать версию файла часового пояса.
Вот пример в моей коробке Linux:
$ genezi -v
Client Shared Library 32-bit - 11.2.0.2.0
System name: Linux
Release: 2.6.32-34-generic
Version: #77-Ubuntu SMP Tue Sep 13 19:39:17 UTC 2011
Machine: x86_64
Operating in Instant Client mode.
Small timezone file = timezone_14.dat
Large timezone file = timezlrg_14.dat
Я определил, что у меня установлена версия 11_2_0_1 текущего клиента. Обновление до 11_2_0_2, похоже, помогло решить эту проблему. Тем не менее, я до сих пор не понимаю, как клиент мгновенного управления обрабатывает его файл часового пояса, или даже где он находится или что это такое. Все источники, которые я прочитал, говорят, чтобы гарантировать, что клиент и сервер имеют одинаковую версию файла часового пояса, но мне не ясно, как это на самом деле делается на клиенте. Может быть, это не то, что я могу напрямую поддерживать, кроме использования другой версии мгновенного клиента?
Помимо других причин, проблема возникает также при использовании python3.6, когда вы выполняете преобразование часового пояса и используете библиотеки cx-Oracle с гораздо более высокой версией, чем база данных.
Это объясняет комментарий от «Мануэль Пино». Как только он комментирует строчку преобразования ТЗ, она работает.
У меня была такая же проблема с python 3.6 с использованием самой последней версии cx-Oracle 8.1.0, но с подключением к старой базе данных 12.1.
- Используемый питон: python3.6
- Установлена самая последняя версия cx-Oracle 8.1.0 (обычно для выпусков около 18-19.x)
- Подключенная база данных: 12.1.0.2
- Мгновенный клиент Oracle 12.2
Вызов запроса без преобразования часового пояса работает нормально:
sql='''select cast (sysdate AS TIMESTAMP WITH TIME ZONE) from dual'''
cur.execute(sql)
cur.fetchone()
(datetime.datetime(2020, 12, 28, 17, 7, 52),)
Вызов аналогичного запроса с преобразованием часового пояса не работает:
sql='''select cast (sysdate AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'UTC' from dual'''
cur.execute(sql)
cur.fetchone()
*** cx_Oracle.DatabaseError: ORA-01805: possible error in date/time operation
Решение в моем случае: перейти на более старый клиент cx-Oracle (клиент Oracle-instant 12.2 остается без изменений)
pip install -U cx-Oracle==6.4.1
Collecting cx-Oracle==6.4.1
Using cached cx_Oracle-6.4.1-cp36-cp36m-manylinux1_x86_64.whl (596 kB)
Installing collected packages: cx-Oracle
Attempting uninstall: cx-Oracle
Found existing installation: cx-Oracle 8.1.0
Uninstalling cx-Oracle-8.1.0:
Successfully uninstalled cx-Oracle-8.1.0
Successfully installed cx-Oracle-6.4.1
Теперь снова тестируем с преобразованием часового пояса:
sql='''select cast (sysdate AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'UTC' from dual'''
cur.execute(sql)
cur.fetchone()
(datetime.datetime(2020, 12, 28, 17, 20, 54),)
У меня такая же проблема с ORA-01505 в Oracle 11G с использованием Docker
ActiveRecord::StatementInvalid (OCIError: ORA-01805: possible error in date/time operation: SELECT "USERS".* FROM "USERS" WHERE "USERS"."EMAIL" = :a1 ORDER BY "USERS"."ID" ASC FETCH FIRST :a2 ROWS ONLY):
Я использовал в docker-compose.yml
environment:
- TZ=America/Guatemala
Так что просто прокомментируйте строку, и все работает
environment:
#- TZ=America/Guatemala