Oracle 01481. 00000 - "无效的数字格式模型"

时间:2016-03-18 12:10:18

标签: oracle concat to-char

这是我以前用来获取金钱价值的查询。当concat值超过异常时坚果。查询是

select to_char(b.balance,'9999.'||d.number_of_decimal_places) from balance b, decimal d

我遇到了这个问题。

3 个答案:

答案 0 :(得分:1)

如果您有数字number_of_decimal_places值,例如1,2,3等,那么您正在构建一个格式模型,例如'9999.2'而不是'9999.99'

您可以使用rpadlpad将该整数值转换为格式模型:

select to_char(b.balance,'9999.'||rpad('9', d.number_of_decimal_places, '9'))
from balance b, decimal d

或者尾随零:

select to_char(b.balance,'9999.'||rpad('0', d.number_of_decimal_places, '0'))
from balance b, decimal d

如果您有number_of_decimal_places字符串,例如' 9',' 99',' 999'等等,除非你在其中一行中有一个无效的值,除了9或0以外的任何字符,你所使用的连接都会有效。

包含空格,您可以在varchar2char字段中添加空格。无论哪种方式,您都可以删除trim

select to_char(b.balance,'9999.'||trim(d.number_of_decimal_places))
from balance b, decimal d

但是如果你有任何其他角色,那么你需要识别并纠正这些行中的数据;如果数据是varchar2列,那么即使使用空格也可以更好地修复数据。

最好使用新式连接;我没有改变这些例子,因为如果你做的是笛卡尔积或者只是省略了连接条件,那就不清楚了。

答案 1 :(得分:0)

如果number_of_decimals返回2之类的值,则:

SELECT TO_CHAR( b.balance, RPAD( '9999.', 5 + d.number_of_decimals, '9' ) )
FROM   balance b
       CROSS JOIN
       decimal d

答案 2 :(得分:0)

无论出于何种原因,' 9999。' || d.number_of_decimal_places的连接正在生成无效的掩码。我们只能猜测实际的表值,空格的存在,或其他可能导致它正在做什么的问题。

所以你的解决方案就是运行:

select '9999.'||d.number_of_decimal_places from decimal d 

查看您正在生成的实际格式掩码,并根据需要进行调整。