你能解释一下以下查询之间的区别吗
SELECT TO_CHAR(1980.55,'$9,999D999') FROM DUAL;
和
SELECT TO_CHAR(1980.55,'$9G999D999') FROM DUAL;
第一个查询失败并出现错误,我不明白的是组分隔符默认为',那么为什么一个失败而另一个成功执行。
有趣的是,以前没有遇到过,但是无法想象你为什么要混合它们。我在文档中甚至在 MSO 上都找不到任何东西,所以我推测...
G
将逗号/句点与组分隔符/小数字符(或)混合时出现的 ORA-01481 错误D
是“无效的数字格式模型”,这表明它纯粹是在验证字符串'$9,999D999'
。似乎在这个阶段它不知道你的NLS_NUMERIC_CHARACTER
设置,即使它被传递给to_char()
函数。这似乎并不太不合理,因为相同的验证将应用于存储代码(过程、包、视图或其他),并且您不会期望基于 NLS 设置(即硬解析)重新验证缓存的查询。
它猜测它可以G
通过 char 的第三个参数指定and的含义来安全地完成D
,但这似乎对于边缘情况来说可能需要做很多工作,如果你对它们进行硬编码,那么意义就更小了无论如何将它们混合在模型中。
因此,如果在验证格式模型字符串时它不知道如何G
以及D
将在运行时进行评估,那么文档中列出的限制就会成为问题。您的逗号应该是组分隔符还是十进制字符?如果在运行时您的十进制字符是.
那么格式将是无效的,因为您只能拥有其中一个。同样,如果模型是,'9.999G999'
那么如果您的组分隔符是有效的.
,但如果是则无效,
。在解析时而不是在运行时失败似乎更安全、更可靠。
或者换句话说,'组分隔符默认为,
'的点是在格式模型被验证之后,所以它没有任何区别。
但是,正如我所说,推测内部结构,这绝不是一个好主意。当文档说“逗号[或组分隔符]不能出现在数字格式模型中的小数字符或句点的右侧”时,它似乎有点误导,因为它们根本不能共存。可能值得提出一个文档错误?
针对 8i 的错误 1204892 提出了一个类似的问题,并作为非错误关闭,并带有评论“这是它的设计工作方式”。