PL SQL:NVL第一个参数类型转换问题

时间:2011-03-01 14:37:42

标签: sql oracle ora-01722

我有一个表有一个列的应用程序

BORROWINGTERM   NUMBER(10,0) Nullable

为什么此脚本会抛出错误(ORA-01722无效数字)

select nvl(borrowingterm, 'no term') from Application 

虽然这个有效

select nvl(to_char(borrowingterm), 'no term') from Application 

这个也有效

select nvl(1234,5678) from dual; 

基于this article

NVL函数的第一个参数应该是字符串类型

5 个答案:

答案 0 :(得分:8)

您收到错误是因为您在nvl子句中混合了两种不同的类型。一个数字,一个字符串。类型必须相同。

答案 1 :(得分:6)

保持简单,

  • String null可以替换为字符串替换值。
  • Number null可以用数字值替换,依此类推..

示例:

select nvl(to_char(borrowingterm), 'no term') from Application; 

//conert number to string and then provide string substitute value to column

select nvl(borrowingterm, 0') from Application; 

// replacing null with 0

答案 2 :(得分:5)

简而言之,如果第一个参数是数字,那么Oracle会尝试将第二个参数转换为数字。

请参阅NVL文档

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions105.htm#i91798

答案 3 :(得分:5)

在您的第一个示例中,因为borrowingterm是一种数字类型,Oracle正在尝试将字符串'no term'隐式转换为数字,因此错误。

请参阅NVL documentation

答案 4 :(得分:2)

  

“NVL功能的第一个参数   应该是字符串类型“

我认为你自己给出了答案。如果你问为什么,你应该考虑在另一个函数中重用NVL的输出类型的可能性。

select to_date(nvl(number_field, 'some_text')) from dual

在上面的情况中,nvl的输出是未知的,因此引发了ORA-01722。