【问题标题】:Oracle Invalid number ORA-01722: invalid number 01722. 00000 - "invalid number"Oracle Invalid number ORA-01722: invalid number 01722. 00000 - "invalid number"
【发布时间】:2021-01-30 15:10:28
【问题描述】:

我正在尝试将字符串值相乘,即 33.000000,但出现错误 ORA-01722。

您能否建议如何正确转换/强制转换此字段以进行乘法?

选择 c1.name 作为模型, p22.value 作为基础AMT, p23.value 作为 TotalAMT

模型 BasisAMT TotalAMT 自动 0.000000 0.000000
汽车 22.000000 33.000000
自动 0.000000 0.000000
自动 0.000000 0.000000

但是我正在尝试做

选择 c1.name 作为模型, 100 * p22.value 作为基础AMT, p23.value 作为 TotalAMT

出现错误。

【问题讨论】:

  • 您报告的内容,单独来看,完全是错误的。 select '33.00000000' * 3 from dual 不会抛出错误;更好的是,它会返回正确的答案99。所以,还有一些你没有告诉我们的事情。你告诉我们的还不够。
  • 对不起,我没有提到这个值来自字段 VARCHAR2(255 CHAR)
  • 没关系。重要的是,您如何断定问题来自字符串“33.00000000”?你怎么知道它不是来自另一个字符串,不能转换为数字(也在同一列,但在不同的行)?
  • 我已经更新了描述,我希望它清楚。
  • 结论 在私聊中继续与OP讨论后,我们发现他的小数点是逗号。正确的解决方案是将字符串列包含在 TO_NUMBER 中并给出明确的 NLS 数字字符,如下所示:to_number(p22.value, '9999d99999999', 'nls_numeric_characters=.,')

标签: oracle


【解决方案1】:

你能调试你看不到的代码吗?不?那你为什么期望别人那样呢?

对字符串进行数学运算是不合逻辑的。字符串中的字符都是数字的事实并没有改变计算机将它们视为字符的事实,与

没有什么不同
'my name is fred' * 23

而且我们甚至不知道所有字符都是数字。它可以用空格字符填充。

您需要查看TO_NUMBER() 函数。

【讨论】:

  • Oracle 在数据类型之间的转换方面非常出色(或者在我看来“相当糟糕”)。如果字符串实际上是数字,Oracle 会将其转换为数字,即使我们没有显式调用 TO_NUMBER。它能够修剪数字两侧的空白(不仅是空格,还有制表符!)。例如,它不会在小数点后修剪空格 - 但 OP 的字符串在小数点后没有空格。还有一些 OP 没有告诉我们的事情。
  • @mathguy - 都是真的。我不相信依赖隐式转换。我希望将 OP 指向正确的显式函数将有助于强化字符串不是数字的基本观点。
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多