甲骨文 01481.00000 - "invalid number format model"

Oracle 01481. 00000 - "invalid number format model"

这是我用来获取货币价值的查询。 Nut when concat value getting above 异常。查询是

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

我被这个问题困住了。

如果您有数字 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 列,也最好修复数据。


最好使用新式连接;我没有更改这些示例,因为不清楚您是在做笛卡尔积还是只是省略了连接条件。

如果 number_of_decimals returns 值类似于 2 那么:

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

无论出于何种原因,“9999”的串联。||d.number_of_decimal_places 生成无效掩码。我们只能猜测实际的 table 值、空格的存在或其他任何可能导致它正在做的事情的问题。

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

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

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