2015-02-11 7 views
6

Wiem, że NaN oznacza Nie numer. Ale mam problem ze zrozumieniem, kiedy i dlaczego Oracle dodaje to do wiersza.Kiedy/dlaczego Oracle dodaje NaN do wiersza w tabeli bazy danych

Jest to, gdy napotka wartość mniejszą niż 0 jak liczba ujemna lub wartość śmieci.

+0

0 i wartość ujemna również są prawidłowe, więc nie są to NaN. Zatem wartość Garbage może być powodem, chociaż trzeba podjąć próbę wstawienia wartości śmieci. – GolezTrol

Odpowiedz

12

From the documentaton:

bazy danych Oracle liczbowe typy danych przechowywać pozytywnych i negatywnych trwałych i zmiennoprzecinkowych liczb, zero, nieskończoność, i wartości, które są niezdefiniowane wynikiem funkcjonowania-„Not a Number” lub NAN.

O ile mi wiadomo, można uzyskać tylko NaN w kolumnie binary_float or binary_double; te typy danych mają their own literals for NaN too, a także dla nich jest is nan condition i nanvl() function, aby nimi manipulować.

Przykładowy sposób, aby uzyskać taką wartość jest podzielenie zero pływaka/podwójnej wartości przez zero:

select 0f/0 from dual; 

0F/0 
---- 
NaN 

... więc jeśli widzisz Nans logiki aplikacji lub bazowego dane mogą być zepsuty. (Zauważ, że nie możesz uzyskać tego z "normalnym" typem numeru, otrzymasz ORA-01476: divisor is equal to zero, chyba że licznik jest zmienny lub podwójny).

Mimo to, nie otrzymasz NaN dla zerowej lub ujemnej liczby. Możliwe jest również, że masz kolumnę z napisami, a aplikacja umieszcza słowo "NaN", ale zapisywanie liczb jako ciągów jest złym pomysłem na wielu poziomach, więc mam nadzieję, że tak nie jest.

+1

Byłbym chętny, aby być ostatnim ... Jedynym czasem, w którym kiedykolwiek natknąłem się na NaN w Oracle, który nie został stworzony przez uciekającą aplikację gdzieś, gdy próbowałem być zbyt sprytny i zawodzę żałośnie:). – Ben

+0

Dzięki Alex. Przybiłeś to. Otrzymałem NaN z powodu podziału przez 0 –

+0

Ale co, jeśli NaN jest wartością normalną, aby pokazać, że liczby nie można obliczyć za pomocą danych wejściowych, aby odróżnić od wartości brakującej, która jest pokazywana przez wartości zerowe? – kirhgoff

5

Nope < = 0 jest nadal liczbą, więc nie do końca. NaN (lub nieskończoność) są specjalnymi wartościami używanymi przez DB, aby zachować jego zdrowy rozsądek, gdy mamy do czynienia z liczbami niecałkowalnymi (+ -∞, lub po prostu czymś, co nie jest liczbą). Oto niektóre kodu:

DECLARE 
    l_bd_test binary_double; 
    l_int_test INTEGER; 
BEGIN 
    l_bd_test := 'NAN'; 
    l_int_test := 0; 
    IF l_bd_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS NAN'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS A #'); 
    END IF; 
    IF l_int_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS NAN'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS A #'); 
    END IF; 
END; 
/

Zastępca NAN dla INFINITY lub nawet negować go i zobaczyć wyniki.