1

你能解释一下以下查询之间的区别吗

SELECT TO_CHAR(1980.55,'$9,999D999') FROM DUAL;

SELECT TO_CHAR(1980.55,'$9G999D999') FROM DUAL;

第一个查询失败并出现错误,我不明白的是组分隔符默认为',那么为什么一个失败而另一个成功执行。

4

1 回答 1

2

有趣的是,以前没有遇到过,但是无法想象你为什么要混合它们。我在文档中甚至在 MSO 上都找不到任何东西,所以我推测...

G将逗号/句点与组分隔符/小数字符(或)混合时出现的 ORA-01481 错误D是“无效的数字格式模型”,这表明它纯粹是在验证字符串'$9,999D999'。似乎在这个阶段它不知道你的NLS_NUMERIC_CHARACTER设置,即使它被传递给to_char()函数。这似乎并不太不合理,因为相同的验证将应用于存储代码(过程、包、视图或其他),并且您不会期望基于 NLS 设置(即硬解析)重新验证缓存的查询。

它猜测它可以G通过 char 的第三个参数指定and的含义来安全地完成D,但这似乎对于边缘情况来说可能需要做很多工作,如果你对它们进行硬编码,那么意义就更小了无论如何将它们混合在模型中。

因此,如果在验证格式模型字符串时它不知道如何G以及D将在运行时进行评估,那么文档中列出的限制就会成为问题。您的逗号应该是组分隔符还是十进制字符?如果在运行时您的十进制字符是.那么格式将是无效的,因为您只能拥有其中一个。同样,如果模型是,'9.999G999'那么如果您的组分隔符是有效的.,但如果是则无效,。在解析时而不是在运行时失败似乎更安全、更可靠。

或者换句话说,'组分隔符默认为,'的点是格式模型被验证之后,所以它没有任何区别。

但是,正如我所说,推测内部结构,这绝不是一个好主意。当文档说“逗号[或组分隔符]不能出现在数字格式模型中的小数字符或句点的右侧”时,它似乎有点误导,因为它们根本不能共存。可能值得提出一个文档错误?


针对 8i 的错误 1204892 提出了一个类似的问题,并作为非错误关闭,并带有评论“这是它的设计工作方式”。

于 2013-02-01T16:58:53.677 回答