oracle - 为什么 Oracle 会吃掉我的字符串?

标签 oracle oracle10g plsqldeveloper

我目前尝试在 Oracle DB 上执行以下查询

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

这似乎不是很复杂。只是 timzone 的名称和大括号中的 UTC 偏移量。但是当我在 Windows 上用 PL/SQL Developer 执行查询时,它总是吃掉最后一个大括号。

所以我去了 sqlplus 并在那里执行它,现在我得到了最后一个大括号,但在最后一个大括号之前还有一个额外的空格作为额外的好处。

我试过嵌套 to_char()trim()但没有任何变化。我也在不同的数据库上尝试过,但它总是一样的。

有人知道tz_offset是否有问题吗?和字符串连接?

最佳答案

发出以下查询:

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 字符串不是以 null 结尾的),因此它不会打扰编写字符串的其余部分,所以你输了尾随大括号。 SQL*PLus 选择打印空格而不是空值,然后继续处理字符串的其余部分,打印右大括号。

作为解决方法,您可以替换 tz_offset(...)replace(tz_offset(...), chr(0)) .这将从 tz_offset(...) 中删除空值返回。

关于oracle - 为什么 Oracle 会吃掉我的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201513/

相关文章:

java - 为什么 Oracle 的 DECODE 给我的值与 NVL 不同?

oracle10g - 将 Oracle Forms 转换为 Apex - 是否值得考虑使用 Apex Forms 迁移工具?

oracle - PL/SQL Developer 的可折叠区域

oracle11g - 使用SQLLDR加载定界数据时跳过数据字段

sql - 列出工资在 30000-50000 之间的临时或兼职员工的 EMPNAME、PHONE、EMAIL - 根据 CITY、FACULTY 和 EMPID 排列

java - 如何优化 Oracle 11g 和 Hibernate 的批量 INSERT?

sql - Oracle "connect by prior"连同 "max() over partition by"删除重复的子树

c - OCI UTF16 环境的 OCILogon 失败

oracle - 如何同时使用其他表中的数据更新具有空值的表?

oracle - 解密 PL/SQL Developer 上存储的密码