【问题标题】:Can I pass a number for varchar2 in Oracle?我可以在 Oracle 中为 varchar2 传递一个数字吗?
【发布时间】:2012-05-12 07:38:45
【问题描述】:

我有一个 Oracle 表和一个列 (col1) 的类型为 varchar2(12 byte)。它有一行,col1 的值为1234

当我说

select * from table where col1 = 1234

Oracle 说无效号码。这是为什么?为什么我不能传递 varchar2 的数字?

编辑:所有的反应都很棒。谢谢你。但我不明白为什么当1234 是有效的varchar2 数据类型时它不采用1234

【问题讨论】:

    标签: sql oracle ora-01722


    【解决方案1】:

    哦,转换成字符比转换成数字要好得多:

    select *
    from table
    where col1 = to_char(1234)
    

    当 col1 看起来不像数字时,to_number 返回错误,停止查询。

    【讨论】:

      【解决方案2】:

      问题是您希望 Oracle 会隐式地将 1234 转换为字符类型。相反,Oracle 隐式将该列转换为一个数字。列中存在非数字值,因此 Oracle 会抛出错误。 Oracle documentation 在解释如何解决隐式转换之前警告不要隐式转换。解释您所看到的行为的规则是:

      将字符值与数值进行比较时,Oracle 会将字符数据转换为数值。

      【讨论】:

      • 谢谢。所以字符是 1234,oracle 正在隐式转换为数字。那么为什么自 1234 以来的错误是一个有效数字?
      • 表格中的内容不是数字。 Oracle 将 1234 作为数字保留。它正在尝试将列中的值转换为匹配。当它找到一个不是数字的值时,它会抛出错误。
      【解决方案3】:

      Oracle 说无效号码。这是为什么?为什么我不能传递一个 varchar2 的数字?

      Oracle 执行从字符类型col1 到数字的隐式转换,因为您将其作为数字进行比较。

      另外,您假设1234 是被提取的唯一 行。实际上,Oracle 必须从表中获取所有行,然后根据where 子句过滤掉。现在,col1 中有一个字符值在遇到您的 1234 行之前被提取,这会导致错误,因为该字符无法转换为数字。

      This fiddle 显示行为。由于abc 无法转换为数字,因此您会收到该错误消息


      现在如果表中的 only 记录是 col1 包含数字字符的记录,您将看到 statement will work fine

      【讨论】:

      • 谢谢。很好的解释
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多