PL SQL: проблема преобразования первого типа NVL - PullRequest
4 голосов
/ 01 марта 2011

У меня есть таблица приложений, в которой есть столбец

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; 

основано на этой статье

первый параметр функции NVL должен быть строкового типа

Ответы [ 5 ]

8 голосов
/ 01 марта 2011

Вы получаете ошибку, потому что вы смешиваете два разных типа в предложении nvl.Один номер, одна строка.Типы должны быть одинаковыми.

6 голосов
/ 07 апреля 2016

Проще говоря,

  • Нулевая строка может быть заменена строковым значением замены.
  • Числовое значение 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

5 голосов
/ 01 марта 2011

В вашем первом примере, поскольку borrowingterm является числовым типом, Oracle пытается неявно преобразовать строку 'no term' в числовое значение, поэтому возникает ошибка.

См. Документацию NVL .

5 голосов
/ 01 марта 2011

Короче говоря, если первый аргумент является числовым, Oracle пытается преобразовать второй аргумент в число.

См. Документацию NVL

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

2 голосов
/ 01 марта 2011

"первый параметр функции NVL должен быть строковым типом"

Я думаю, что вы дали ответ сами.Если вы спрашиваете, почему, вам следует рассмотреть возможность повторного использования типа вывода NVL в другой функции.

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

В описанной выше ситуации вывод nvl неизвестен, поэтому ORA-01722 повышается.

...