【问题标题】:Oracle DB Query Issue : Same query different behaviourOracle DB 查询问题:相同的查询不同的行为
【发布时间】:2016-10-12 20:28:57
【问题描述】:

以下是我的查询。在一个 Oracle DB (11.2.3.0) 中,这给了我错误,但在其他相同的 Oracle DB 中,下面的查询工作正常。无法理解这种不同的行为。

一个数据库的输出

SQL> select id  from cag where greeting_id=1111100001 for update;

ERROR at line 1:
ORA-01722: invalid number

其他数据库的输出

SQL> select id from cag where greeting_id=1111100001 for update;

ID - 9111100001 

有没有DB内部设置?

【问题讨论】:

  • greeting_id 列的数据类型是什么?看起来您将 ID 存储为字符串,并且某些值不代表数字。如果它们应该始终是数字,请将它们存储为数字。始终使用正确的数据类型。
  • 这是数据类型:GREETING_ID NOT NULL VARCHAR2(50)
  • 在一个数据库中查询工作正常,但在其他数据库中,相同的查询给了我错误。

标签: sql oracle oracle11g type-conversion


【解决方案1】:

您将数字存储在varchar2 列中。这不是一个好的做法,原因有很多,包括性能,尤其是因为它会导致这样的数据问题。

如果该列只应该包含数字,则将其设为实际数字列。

如果它是一个预计包含数字和其他数据的通用列,那么您真的应该重新考虑设计并将不同类型的数据放在正确类型的单独列中。 看起来它应该总是一个数字 - 你不会期望一个 ID 有不同的类型。

同时,要查询字符串列,您需要避免隐式转换。在你这样做的那一刻:

select id  from cag where greeting_id=1111100001;

数据库必须将greeting_id 列中的每个字符串转换为一个数字,然后再将其与1111100001 进行比较,而正是从字符串到数字的隐式转换引发了错误 - 因为您在列中有值不能隐式转换。在一个数据库中,所有列值都可以转换;另一方面,至少一个值不能。如果您没有预料到,请查看数据,看看是否有人存储了一些意想不到的内容,例如“无”、“无效”或“未知”,甚至是带有错误小数分隔符的小数。

如果您在查找字符串时必须坚持使用字符串 - 将列数据与相同类型的值和文字进行比较:

select id  from cag where greeting_id='1111100001';

正确的方法是使列成为正确的数据类型。

【讨论】:

  • ....查看数据以查看是否有人存储了意外的内容,例如“无”或“无效”或“未知”,甚至是带有错误小数分隔符的小数... ..这对我有帮助。有人存储了错误的数据...谢谢 Alex
  • @VJS - 如果数据类型为 NUMBER,他们将无法能够存储无效数据。
  • 这是一个遗留问题。我现在将检查并相应地更新数据类型。非常感谢你的帮助。这是非常好的和直截了当的答案。
猜你喜欢
  • 2021-11-19
  • 2019-02-21
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
相关资源
最近更新 更多