to_char выдает разные выходные данные в зависимости от того, где вызывается процедура - PullRequest
1 голос
/ 13 декабря 2011

Мы используем хранимую процедуру, предоставленную удаленной системой. В целях тестирования я вызываю эту процедуру с моей машины для разработки. Теперь проблема в том, что если я вызываю процедуру из Toad , все в порядке. Но когда я вызываю его с помощью SQL Developer , возникает ошибка.

Я отладил и отладил и обнаружил следующее: в процедуре дата истечения срока действия генерируется и передается веб-службе (не спрашивайте меня, почему).

Вот строки, ответственные за генерацию даты:

vt_User.EXPDATE := TO_DATE('01.01.2025', 'dd.mm.yyyy');
vs_Value := to_char(vt_User.EXPDATE, 'YYYY-MM-DD"T"HH24:MI:SSTZR');

vs_Value, когда вызывается из Жаба генерируется как:

2025-01-01T00:00:00+02:00

Но если я позвоню из SQL Developer , это будет похоже на

2025-01-01T00:00:00EUROPE/ATHENS

Все, кроме этих строк, абсолютно одинаково. Я испробовал много разных подходов, пытаясь установить NLS_LANG, изменить сеанс и т. Д., Но безрезультатно.

Мне нужно решить эту проблему, потому что то же самое происходит, когда я вызываю процедуру из Java кода, и это главная проблема.

Я подключаюсь к удаленной базе данных, используя TNS для Toad и SQL Developer, тонкий драйвер для кода Java.

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

В БД Oracle у вас в основном есть определение TIME_ZONE для БД, но вы можете изменить его для сеанса. В этом случае DB time_zone устанавливается в абсолютном смещении от формата UTC, которое вам нужно. Вероятно, разработчик SQL открыл сеанс в формате имени региона часового пояса, что можно увидеть с помощью:

select sessiontimezone, dbtimezone from dual;

Таким образом, может помочь изменение сеанса на dbtimezone.

ALTER SESSION SET TIME_ZONE=dbtimezone;
0 голосов
/ 31 января 2014

есть другое решение, использующее tzh и tzm:

select to_char(current_timestamp, 'yyyy-mm-dd"T"hh24:mi:sstzh:tzm') from dual
...