Oracle
 sql >> Datenbank >  >> RDS >> Oracle

NLS_NUMERIC_CHARACTERS-Einstellung für Dezimalzahlen

Sie können Ihre aktuellen Sitzungseinstellungen anzeigen, indem Sie nls_session_parameters abfragen :

select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

VALUE                                  
----------------------------------------
.,                                       

Das kann von den Datenbankvorgaben abweichen, die Sie in nls_database_parameters sehen können .

In dieser Sitzung Ihre Abfragefehler:

select to_number('100,12') from dual;

Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"

Ich könnte meine Sitzung ändern, entweder direkt mit alter session oder indem ich sicherstelle, dass mein Client so konfiguriert ist, dass er zu der Einstellung führt, die der String benötigt (er kann zum Beispiel von einem Betriebssystem oder einer Java-Locale geerbt werden):

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

TO_NUMBER('100,12')
-------------------
             100,12 

In SQL Developer können Sie Ihren bevorzugten Wert in Tool->Preferences->Database->NLS.

festlegen

Aber ich kann diese Sitzungseinstellung auch als Teil der Abfrage mit dem optionalen dritten nlsparam überschreiben Parameter zu to_number(); obwohl das das optionale zweite fmt macht Parameter ebenfalls erforderlich, also müssten Sie in der Lage sein, ein geeignetes Format auszuwählen:

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 

Standardmäßig wird das Ergebnis immer noch mit meinen Sitzungseinstellungen angezeigt, daher ist das Dezimaltrennzeichen immer noch ein Punkt.