テストマシンに1つ、実稼働マシンに2つ目のdbセットアップがあります。実行すると:
select to_number('100,12') from dual
その後、テストマシンでエラーが発生します。ただし、このステートメントは本番マシンでは非常にうまく機能します。
NLS_NUMERIC_CHARACTERSを確認すると、両方のマシンに「、」(コンマ)が表示されます。 10進数の設定を探す必要がある他の場所はありますか?
乾杯!
_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
_
デフォルトでは、セッション設定とともに結果が表示されるため、小数点記号は依然としてピリオドです。
Jaanna、Oracle SQL Developerのsessionパラメータはクライアントコンピュータに依存しますが、- [〜#〜] nls [〜#〜]PL/SQLのパラメーターはサーバーからのものです。
たとえば、クライアントコンピューターのNLS_NUMERIC_CHARACTERS
は、サーバーでは '。、'ですが、 '、。'にすることができます。
したがって、PL/SQLおよびOracle SQL Developerからスクリプトを実行する場合、同じスクリプトに対して小数点区切り文字が完全に異なる場合があります。ただし、スクリプトで予想されるNLS_NUMERIC_CHARACTERS
でセッションを変更します。
セッションパラメータを簡単にテストする1つの方法は次のとおりです。
select to_number(5/2) from dual;
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
を返します。
最善の方法は、
SELECT to_number(replace(:Str,',','')/100) --into num2
FROM dual;