it-swarm.com.de

NLS_NUMERIC_CHARACTERS Einstellung für Dezimalzahl

Ich habe eine Db-Konfiguration in einer Testmaschine und eine zweite in der Produktionsmaschine. Wenn ich renne:

select to_number('100,12') from dual 

Dann gibt es einen Fehler in der Testmaschine. Diese Aussage funktioniert jedoch gut in Produktionsmaschinen.

Wenn ich nun nach NLS_NUMERIC_CHARACTERS suche, sehe ich in beiden Maschinen ',' (Komma). Gibt es irgendwo anders, wo ich nach der Dezimaleinstellung suchen sollte?

Prost!

11
Jaanna

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                                  
----------------------------------------
.,                                       

Dies kann sich von den Datenbankstandardwerten unterscheiden, die Sie in nls_database_parameters sehen können.

In dieser Sitzung werden Ihre Abfragefehler angezeigt:

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 sichergestellt wird, dass mein Client so konfiguriert ist, dass die Zeichenfolge benötigt wird (dies kann beispielsweise von einem Betriebssystem oder einem Java-Gebietsschema übernommen 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 unter Tool-> Preferences-> Database-> NLS Ihren bevorzugten Wert festlegen.

Ich kann diese Sitzungseinstellung aber auch als Teil der Abfrage überschreiben, mit dem optionalen dritten Parameter nlsparam auf to_number() ; Dies macht jedoch auch den optionalen zweiten fmt -Parameter erforderlich, sodass Sie ein geeignetes Format auswählen müssen:

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 in meinen Sitzungseinstellungen angezeigt, daher ist das Dezimaltrennzeichen immer noch ein Punkt.

26
Alex Poole

Jaanna, die Parameter session in Oracle SQL Developer sind von Ihrem Clientcomputer abhängig, während die ParameterNLSin PL/SQL vom Server stammen.

Beispielsweise kann der NLS_NUMERIC_CHARACTERS auf dem Client-Computer ', sein. 'während es' ., 'auf dem Server ist. 

Wenn Sie also ein Skript aus PL/SQL und Oracle SQL Developer ausführen, kann das Dezimaltrennzeichen für dasselbe Skript völlig anders sein, es sei denn, Sie ändern die Sitzung mit Ihrem erwarteten NLS_NUMERIC_CHARACTERS im Skript. 

Sie können den Sitzungsparameter ganz einfach testen, indem Sie Folgendes tun:

select to_number(5/2) from dual;
2
Jonas

Um das Dezimaltrennzeichen von SESSION zu kennen, können Sie den folgenden SQL-Befehl verwenden:

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;

Der erste SELECT-Befehl sucht den NLS-Parameter, der in der Tabelle NLS_SESSION_PARAMETERS definiert ist. Das Dezimaltrennzeichen ist das erste Zeichen des zurückgegebenen Werts.

Mit dem zweiten SELECT-Befehl wird die 0.5-Rational-Zahl IMPLICITELY in einen String konvertiert, wobei (standardmäßig) NLS_NUMERIC_CHARACTERS auf Sitzungsebene definiert wird.

Beide Befehle geben denselben Wert zurück.

Ich habe den gleichen SQL-Befehl bereits in PL/SQL-Skripts getestet, und dies ist immer derselbe Wert COMMA oder POINT, der angezeigt wird. Das in PL/SQL-Skript angezeigte Dezimaltrennzeichen entspricht dem in SQL angezeigten.

Um zu testen, was ich sage, habe ich folgende SQL-Befehle verwendet:

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

Der kürzere Befehl zum Erkennen des Dezimaltrennzeichens lautet:

SELECT .5 FROM DUAL;

Dieser Rückgabewert 0,5, wenn das Dezimaltrennzeichen ein COMMA ist, und 0.5, wenn das Dezimaltrennzeichen ein PUNKT ist. 

0
schlebe

Der beste Weg ist,

SELECT to_number(replace(:Str,',','')/100) --into num2 
FROM dual;
0
Pramod