web-dev-qa-db-ja.com

NLS_NUMERIC_CHARACTERS 10進数の設定

テストマシンに1つ、実稼働マシンに2つ目のdbセットアップがあります。実行すると:

select to_number('100,12') from dual 

その後、テストマシンでエラーが発生します。ただし、このステートメントは本番マシンでは非常にうまく機能します。

NLS_NUMERIC_CHARACTERSを確認すると、両方のマシンに「、」(コンマ)が表示されます。 10進数の設定を探す必要がある他の場所はありますか?

乾杯!

14
Jaanna

_nls_session_parameters_を照会することにより、現在のセッション設定を確認できます。

_select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

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

これは、_nls_database_parameters_で確認できるデータベースのデフォルトとは異なる場合があります。

このセッションでは、クエリエラー:

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

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

_alter session_で直接、または必要な文字列を設定するようにクライアントを構成することで、セッションを変更できます(オペレーティングシステムまたはJavaロケールから継承される場合があります) 、 例えば):

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

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

SQL Developerでは、Tool-> Preferences-> Database-> NLSで優先値を設定できます。

ただし、オプションの3番目のnlsparamパラメーターを to_number()に設定して、クエリの一部としてそのセッション設定をオーバーライドすることもできます ;ただし、オプションの2番目のfmtパラメーターも必要になるため、適切な形式を選択できる必要があります。

_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 
_

デフォルトでは、セッション設定とともに結果が表示されるため、小数点記号は依然としてピリオドです。

33
Alex Poole

JaannaOracle SQL Developersessionパラメータはクライアントコンピュータに依存しますが、- [〜#〜] nls [〜#〜]PL/SQLのパラメーターはサーバーからのものです。

たとえば、クライアントコンピューターのNLS_NUMERIC_CHARACTERSは、サーバーでは '。、'ですが、 '、。'にすることができます。

したがって、PL/SQLおよびOracle SQL Developerからスクリプトを実行する場合、同じスクリプトに対して小数点区切り文字が完全に異なる場合があります。ただし、スクリプトで予想​​されるNLS_NUMERIC_CHARACTERSでセッションを変更します。

セッションパラメータを簡単にテストする1つの方法は次のとおりです。

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

SESSION小数点を知るには、次の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;

最初のSELECTコマンドは、NLS_SESSION_PARAMETERSテーブルで定義されたNLSパラメーターを見つけます。小数点記号は、返される値の最初の文字です。

2番目のSELECTコマンドは、セッションレベルで定義されたNLS_NUMERIC_CHARACTERSを使用して、暗黙的に0.5有理数を文字列に変換します。

Bothコマンドは同じ値を返します。

PL/SQLスクリプトで同じSQLコマンドをすでにテストしましたが、これは常に表示されるCOMMAまたはPOINTと同じ値です。 PL/SQLスクリプトに表示される小数点区切り記号は、SQLに表示されるものと同じです。

私の言うことをテストするために、次の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;
/

小数点区切りを知るための短いコマンドは次のとおりです。

SELECT .5 FROM DUAL;

小数点区切りがCOMMAの場合は0,5を返し、小数点区切りがPOINTの場合は0.5を返します。

0
schlebe

最善の方法は、

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