2015-02-11 8 views
6

So che NaN sta per Not a Number. Tuttavia, ho difficoltà a capire quando e perché Oracle lo aggiunge a una riga.Quando/Perché Oracle aggiunge NaN a una riga in una tabella di database

È quando incontra un valore inferiore a 0 come un numero negativo o quando è un valore immondizia.

+0

0 e valore negativo sono anche validi, quindi non sono NaN. Quindi il valore Garbage può essere una ragione, anche se devi fare uno sforzo per inserire un valore spazzatura. – GolezTrol

risposta

12

From the documentaton:

database Oracle tipi di dati numerici memorizzare numeri fissi e in virgola mobile positivi e negativi, zero, infinito e valori che sono il risultato di un indefinito funzionamento- "non un numero" o NAN.

Per quanto ne so, è possibile ottenere solo NaN in una colonna binary_float or binary_double; questi tipi di dati hanno lo their own literals for NaN too e c'è anche uno is nan condition e lo nanvl() function per manipolarli.

Un esempio di un modo per ottenere tale valore è quello di dividere un/doppio valore zero float per zero:

select 0f/0 from dual; 

0F/0 
---- 
NaN 

... quindi se stai vedendo NaNs la logica dell'applicazione o sottostanti dati potrebbe essere rotto. (Nota che non è possibile ottenere questo con un tipo di numero 'normale', si ottiene ORA-01476: divisor is equal to zero a meno che il numeratore sia mobile o doppio).

Non si otterrà il NaN per zero o numeri negativi. È anche possibile avere una colonna di stringhe e un'applicazione sta inserendo la parola "NaN", ma memorizzare numeri come stringhe è una cattiva idea su molti livelli, quindi spero che non sia così.

+1

Sarei disposto a essere l'ultimo ... l'unica volta in cui mi sono imbattuto in NaN in Oracle che non è stato creato da un'applicazione in fuga da qualche parte era quando stavo cercando di essere troppo intelligente e fallendo miseramente:). – Ben

+0

Grazie Alex. L'hai inchiodato. Stavo ottenendo un NaN a causa di una divisione di 0 –

+0

Ma cosa succede se NaN è un valore normale per mostrare che il numero non può essere calcolato con un dato input per distinguere dal valore mancante che viene mostrato da null? – kirhgoff

5

Nope < = 0 è ancora un numero così non proprio. NaN (o infinito) sono valori speciali che il DB usa per mantenere il suo equilibrio quando si tratta di numeri non calcolabili (+ -∞, o semplicemente qualcosa che non è un numero). Ecco po 'di codice:

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; 
/

sostituto NAN per INFINITY o addirittura negare e vedere i risultati.

Problemi correlati