我可以在Oracle中为varchar2传递一个数字吗?

时间:2012-05-02 19:29:19

标签: sql oracle ora-01722

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

当我说

select * from table where col1 = 1234

Oracle说无效号码。这是为什么?为什么我varchar2时无法传递数字?

编辑:所有回复都很棒。谢谢。但是,当1234是有效的varchar2数据类型时,我无法理解为什么它不会1234

3 个答案:

答案 0 :(得分:5)

问题是您希望Oracle将隐式地将1234转换为字符类型。相反,Oracle隐式地将列转换为数字。列中存在非数字值,因此Oracle会引发错误。 Oracle documentation在它解释如何解决之前就警告反对隐式演员。解释您所看到的行为的规则是:

  

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

答案 1 :(得分:4)

哦,转换为char而不是数字要好得多:

select *
from table
where col1 = to_char(1234)

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

答案 2 :(得分:4)

  

Oracle说无效号码。这是为什么?为什么我在varchar2时无法传递数字?

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

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

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


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