Почему Oracle ест мою строку? - PullRequest
8 голосов
/ 01 июня 2011

В настоящее время я пытаюсь выполнить следующий запрос к базе данных Oracle

select tzname || ' (UTC'|| tz_offset(tzname) || ')' from v$timezone_names

Кажется, это не очень сложно. Просто название тимзоны и смещение UTC в скобках. Но когда я выполняю запрос с PL / SQL Developer на окнах, он всегда съедает последнюю скобку.

Итак, я пошел в sqlplus и выполнил его там, и теперь я получаю свою последнюю скобку, а также дополнительный пробел перед последней скобкой в ​​качестве дополнительной возможности.

Я пробовал это с вложенными to_char() и trim(), но ничего не меняется. Я также пробовал это на разных БД, но всегда одинаково.

Кто-нибудь знает, есть ли проблема с tz_offset и конкатенацией строк?

Ответы [ 3 ]

7 голосов
/ 01 июня 2011

Выдает следующий запрос:

select dump(tz_offset(tzname)) from v$timezone_names;

Вы получаете результаты, подобные этим:

Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
Typ=1 Len=7: 43,48,49,58,48,48,0
...

Это показывает, что tz_offset() возвращает строки с нулевым символом в конце (возможно, ошибка). Так что по вашему запросу Oracle возвращает

"Africa/Algiers (UTC+01:00\0)" // Note \0 -> null character
"Africa/Cairo (UTC+03:00\0)" // Note \0 -> null character
...

Имея это в виду, я предполагаю, что PL / SQL Developer интерпретирует \ 0 как конец строки (может быть, еще одна ошибка, строки SQL не заканчиваются нулем), и поэтому он не мешает писать остальную часть строки, так что вы теряете завершающую скобку. SQL * PLus выбирает вместо этого пустое пространство вместо этого нулевого значения, а затем переходит к остальной части строки, печатая закрывающую скобку.

В качестве обходного пути вы можете заменить tz_offset(...) на replace(tz_offset(...), chr(0)). Это удалит нули из того, что tz_offset(...) возвращает.

1 голос
/ 01 июня 2011

Он работает с подстрокой, но на самом деле это не отвечает на ваш вопрос, почему это происходит: -):

выберите имя tzname || '(UTC' || substr (tz_offset (tzname), 1,6) || ')' из v $ timezone_names;

0 голосов
/ 04 мая 2016

Я создавал ресурс JSON ajax, который возвращает временные метки, которые должны включать смещение часового пояса ... этот конечный управляющий символ действительно раздражал меня, если я отключу его следующим образом:Канада / Mountain '),' [[: CNTRL:]]», '')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...