带有to_number函数的Oracle数据类型转换问题

时间:2014-01-24 18:12:13

标签: sql oracle function

我遇到了一个奇怪的场景,其中to_number函数无法将存储在字符串数据类型列中的数字转换为一个数据库而不能转换为另一个数据库。

因此,为了排除所有可能的场景,例如额外的空格,空值,垃圾等,我在列上只选择了一个单独的并应用了to_number函数,我完全不是将数字保存为字符串的最佳做法。

有趣的是,查询在一个数据库中执行正常但在其他数据库中执行。

以下查询在开发中运行正常但在测试数据库中运行。

select column_name 
from table_name 
where to_number(column_name) = 1618

此外,当我在测试中运行以下查询时,我得到的结果没有任何错误。

select to_number(column_name) from table_name 

当我将to_number函数移动到where子句时,就是当我收到无效数字错误时。

有什么想法吗?

...谢谢

1 个答案:

答案 0 :(得分:2)

问题几乎可以肯定,在抛出错误的数据库中,您至少有一行具有无法转换为数字的字符串值。找到该行的最简单方法通常是执行类似

的操作
CREATE FUNCTION is_number( p_str IN VARCHAR2 )
  RETURN VARCHAR2
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN 'Yes';
EXCEPTION
  WHEN others 
  THEN
    RETURN 'No';
END;

然后

SELECT column_name
  FROM table_name
 WHERE is_number( column_name ) = 'No';

至于为什么

SELECT to_number( column_name )
  FROM table_name

有效,你确定你正在抓每一行吗?在运行查询时,大多数工具只会获取第一行,比如50行,并等待用户在数据库继续执行查询之前请求更多数据。假设无效数据在第10,001行,Oracle会很高兴地成功返回前10,000行,然后在请求获取行10,001时抛出错误。