Oracle 错误ORA-01722不一致:无效数字
当我执行查询时,我收到一个错误消息“ORA-01722:无效号码”。正如在中所述,我发现,当我为一个需要Oracle 错误ORA-01722不一致:无效数字,oracle,Oracle,当我执行查询时,我收到一个错误消息“ORA-01722:无效号码”。正如在中所述,我发现,当我为一个需要varchar的列使用一个数值时,就会出现这个错误。 在我的例子中,我的查询有一个case语句,如 CASE WHEN CHAR_COLUMN= 1 THEN 'SOME VALUE' END 但在同一oracle版本的不同实例中,行为是不同的。同一个查询在我们的一个dev-oracle服务器中有效,但在另一个服务器中无效。我很好奇是否有任何配置允许oracle在字符列中使用数值 PS:我们
varchar
的列使用一个数值时,就会出现这个错误。
在我的例子中,我的查询有一个case语句,如
CASE WHEN CHAR_COLUMN= 1 THEN 'SOME VALUE' END
但在同一oracle版本的不同实例中,行为是不同的。同一个查询在我们的一个dev-oracle服务器中有效,但在另一个服务器中无效。我很好奇是否有任何配置允许oracle在字符列中使用数值
PS:我们使用的oracle版本是oracle Database 11g Express Edition 11.2.0.2.0版-64位生产版我从不依赖,但始终明确:
CASE WHEN CHAR_COLUMN = TO_CHAR(1) THEN 'SOME VALUE' END
甚至根本不转换:
CASE WHEN CHAR_COLUMN = '1' THEN 'SOME VALUE' END
原因是Oracle倾向于将字符串转换为数字,而不是相反。请参见链接手册页面中的示例:
文本文字示例
文本文字“10”具有数据类型CHAR。如果它出现在数字表达式中,则Oracle会将其隐式转换为数字数据类型,如以下语句所示:
SELECT salary + '10'
FROM employees;
致:
然后,当查询数值1
时,第一个查询表工作,第二个不工作:
select * from foo where CHAR_COLUMN = 1;
select * from bar where CHAR_COLUMN = 1;
当您要求Oracle解决此比较时:
WHEN CHAR_COLUMN = 1
。。。Oracle在内部将查询转换为:
WHEN TO_NUMBER(CHAR_COLUMN) = 1
在我的示例中,这可以在解释计划中发现:
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 3 | 00:00:01 |
| * 1 | TABLE ACCESS FULL | FOO | 1 | 7 | 3 | 00:00:01 |
---------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(TO_NUMBER("CHAR_COLUMN")=1)
这两个服务器可能只是拥有不同的数据,而您的dev服务器没有任何带有非数字字符串的行?
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 3 | 00:00:01 |
| * 1 | TABLE ACCESS FULL | FOO | 1 | 7 | 3 | 00:00:01 |
---------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(TO_NUMBER("CHAR_COLUMN")=1)