发出以下查询:
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 选择打印一个空格而不是那个 null,然后继续处理字符串的其余部分,打印右大括号。
作为一种解决方法,您可以替换tz_offset(...)为replace(tz_offset(...), chr(0)). 这将从tz_offset(...)返回的任何内容中删除空值。