ORA-01722:列中的数字无效,只有数字?

时间:2017-11-29 11:58:42

标签: sql oracle oracle11g

我做了一个相当简单的视图,只返回数字为CONTRACT_ID列的行。 CONTRACT_ID的数据类型编号为(8)。

CREATE OR REPLACE VIEW cid AS
  SELECT * 
  FROM transactions
  WHERE contract_id IS NOT NULL 
  AND LENGTH(contract_id) > 0;

查看工作正常,直到我向下滚动到行~2950,我得到ORA-01722。如果我想将数据导出到Excel,同样的事情发生,我的文件只有~2950行而不是预期的~20k。 知道可能导致这个问题的原因以及如何解决这个问题吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

您写了太多SQL ..以下内容将提供您需要的所有结果:

  CREATE OR REPLACE VIEW cid AS
  SELECT * 
  FROM transactions
  WHERE contract_id IS NOT NULL

你不能LENGTH()一个数字 - 一个数字是null或它是一个值,所以你不需要这种检查。

将号码传递给LENGTH()会先将其变为字符串,即LENGTH(TO_CHAR(numbercolumn))。您甚至不需要LENGTH()检查空字符串,因为oracle NULL字符串和零长度字符串是等效的,并且对空字符串或null调用LENGTH()将返回null,而不是0(所以LENGTH(myNullStr) = 0没有用;它不是比较0 = 0,它比较null = 0和null比较任何东西总是假的)。

这个似乎引起混淆的唯一一次是当表中的字符串列是CHAR类型而不是VARCHAR类型时,人们忘记了为CHAR分配空字符串会导致它变成空格填充到CHAR长度因此,不再是零长度字符串

答案 1 :(得分:0)

首先,你应该删除有关长度()的冗余条件,它是毫无意义的。我不确定它是如何产生这样的错误的,但检查错误是否在它之后消失了。

如果不是,请将星号(*)替换为某些字段名称,例如contract_id。如果它将修复错误 - 它会将错误源指定到已移除的字段中(例如,如果使用生成的列)。

我无法想象在此之后错误如何仍然存在,如果是这样,我试图将其移动到其他表空间并添加到字段列表中调用日志函数来存储rowid的行read - 从而检查哪一行产生错误。