Impostazione NLS_NUMERIC_CHARACTERS per i decimali

Ho una configurazione db in una macchina di prova e una seconda nella macchina di produzione. Quando corro:

select to_number('100,12') from dual 

Quindi dà errore nella macchina di prova. Tuttavia, questa affermazione funziona abbastanza bene nella macchina di produzione.

Ora, quando controllo NLS_NUMERIC_CHARACTERS, vedo “,” (virgola) in entrambe le macchine. C’è un altro posto dovrei cercare l’impostazione decimale?

Saluti!

Puoi vedere le impostazioni correnti della sessione interrogando nls_session_parameters :

 select value from nls_session_parameters where parameter = 'NLS_NUMERIC_CHARACTERS'; VALUE ---------------------------------------- ., 

Potrebbe differire dai valori predefiniti del database, che puoi vedere in nls_database_parameters .

In questa sessione i tuoi errori di ricerca:

 select to_number('100,12') from dual; Error report - SQL Error: ORA-01722: invalid number 01722. 00000 - "invalid number" 

Potrei alterare la mia sessione, direttamente con alter session o assicurando che il mio client sia configurato in modo tale da portare alle impostazioni richieste dalla stringa (può essere ereditato da un sistema operativo o da una locale Java, ad esempio):

 alter session set NLS_NUMERIC_CHARACTERS = ',.'; select to_number('100,12') from dual; TO_NUMBER('100,12') ------------------- 100,12 

In SQL Developer puoi impostare il tuo valore preferito in Strumenti-> Preferenze-> Database-> NLS.

Ma posso anche scavalcare l’impostazione della sessione come parte della query, con il terzo parametro nlsparam opzionale to_number() ; sebbene ciò renda necessario anche il secondo parametro fmt opzionale, quindi dovresti essere in grado di scegliere un formato adatto:

 alter session set NLS_NUMERIC_CHARACTERS = '.,'; select to_number('100,12', '99999D99', 'NLS_NUMERIC_CHARACTERS='',.''') from dual; TO_NUMBER('100,12','99999D99','NLS_NUMERIC_CHARACTERS='',.''') -------------------------------------------------------------- 100.12 

Di default il risultato è ancora visualizzato con le mie impostazioni di sessione, quindi il separatore decimale è ancora un punto.

Jaanna , i parametri di sessione in Oracle SQL Developer dipendono dal tuo computer client, mentre i parametri NLS su PL / SQL provengono dal server.

Ad esempio, NLS_NUMERIC_CHARACTERS sul computer client può essere ” ,. ‘mentre è’ ., ‘sul server.

Pertanto, quando si esegue script da PL / SQL e Oracle SQL Developer, il separatore decimale può essere completamente diverso per lo stesso script, a meno che non si modifichi la sessione con il NLS_NUMERIC_CHARACTERS previsto nello script.

Un modo per testare facilmente il parametro della sessione è:

 select to_number(5/2) from dual; 

Per conoscere il separatore decimale SESSION, è ansible utilizzare il seguente comando SQL:

 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', '; select SUBSTR(value,1,1) as "SEPARATOR" ,'using NLS-PARAMETER' as "Explanation" from nls_session_parameters where parameter = 'NLS_NUMERIC_CHARACTERS' UNION ALL select SUBSTR(0.5,1,1) as "SEPARATOR" ,'using NUMBER IMPLICIT CASTING' as "Explanation" from DUAL; 

Il primo comando SELECT trova il parametro NLS definito nella tabella NLS_SESSION_PARAMETERS . Il separatore decimale è il primo carattere del valore restituito.

Il secondo comando SELECT converte IMPLICITAMENTE il numero razionale 0.5 in una stringa usando (per impostazione predefinita) NLS_NUMERIC_CHARACTERS definito a livello di sessione.

Il comando both restituisce lo stesso valore.

Ho già testato lo stesso comando SQL nello script PL / SQL e questo è sempre lo stesso valore COMMA o POINT che viene visualizzato. Separatore decimale visualizzato nello script PL / SQL è uguale a ciò che viene visualizzato in SQL.

Per testare quello che dico, ho usato i seguenti comandi SQL:

 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ', '; select 'DECIMAL-SEPARATOR on CLIENT: (' || TO_CHAR(.5,) || ')' from dual; DECLARE S VARCHAR2(10) := '?'; BEGIN select .5 INTO S from dual; DBMS_OUTPUT.PUT_LINE('DECIMAL-SEPARATOR in PL/SQL: (' || S || ')'); END; / 

Il comando più breve per conoscere il separatore decimale è:

 SELECT .5 FROM DUAL; 

Quel ritorno 0,5 se il separatore decimale è un COMMA e 0.5 se il separatore decimale è un PUNTO.