TO_CHAR()を使用する場合 Oracleで数値をフォーマットする関数では、フォーマットモデルを使用して数値のフォーマット方法を決定します。
たとえば、12,345.00のような数値をフォーマットできます。 または12.345,00のように 、ロケールによって異なります。
フォーマットモデルには、Gを含めることができます またはD 要素をフォーマットして、数値にコンマを追加します。どちらを使用するかは、カンマを千単位の区切り文字として使用するか、10進文字として使用するかによって異なります。
または、実際のカンマ文字(,)を使用することもできます )必要に応じて、このメソッドはGのようにロケールを認識しませんが およびD フォーマット要素は。
G およびD フォーマット要素
Gを示す例を次に示します。 およびD フォーマット要素:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL; 結果:
12,345.00
この場合、グループ区切り文字はコンマを出力し、10進文字はピリオドを出力します。これは、現在のセッションのNLS_TERRITORY パラメータがAustraliaに設定されている 。
NLS_TERRITORYを変更するとどうなりますか Germanyへのパラメータ :
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL; 結果:
12.345,00
現在、10進文字にはコンマが使用されています。
上記のフォーマットモデルの簡単な説明として:
-
fmformat修飾子は、結果に適用される可能性のあるすべてのパディングを抑制します。 -
9文字は数字を表します。 -
0文字は、先頭または末尾のゼロを抑制せずに数値を表します。
クイックリファレンスとして使用できる数値形式要素の完全なリストは次のとおりです。
T 彼はNLS_NUMERIC_CHARACTERS パラメータ
NLS_NUMERIC_CHARACTERS パラメータ
NLS_TERRITORYを設定すると パラメータ(前の例のように)、これはNLS_NUMERIC_CHARACTERSを含む他のパラメータの束を暗黙的に設定します パラメータ。
T NLS_NUMERIC_CHARACTERS パラメータは、グループ区切り文字と10進文字に使用される文字を決定します。
V$NLS_PARAMETERSをクエリできます グループ区切り文字と10進文字に使用されている文字を確認するためのビュー:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS'; 結果:
,.
ここでは、 10進文字がコンマで表され、グループ区切り文字がピリオドで表されていることがわかります。
NLS_NUMERIC_CHARACTERSの値を変更できます 必要に応じて直接パラメータを設定します(つまり、NLS_TERRITORYを変更せずに パラメータ)。
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL; 結果:
12,345.00
ただし、これはNLSパラメータ間の切断を引き起こすため、おそらくこれを避ける必要があります。 NLSパラメータは、現在の地域のデフォルト値を反映しなくなりました。正当な理由がない限り、通常はNLS_TERRITORYを変更することをお勧めします。 関連する地域のパラメータ。他のパラメータも新しい地域のデフォルトに更新できます。
'nlsparam' 引数
私が言及しなければならないことの1つは、T0_CHAR() 関数は、NLS_NUMERIC_CHARACTERSを含むさまざまなNLSパラメーターを一時的に設定できるようにする3番目の引数を受け入れます。 パラメータ。関数レベルでこれを行う場合、現在のセッションのこれらのパラメーターの値は変更されません。
次に例を示します:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT
TO_CHAR(12345, 'fm99G999D00') AS "r1",
TO_CHAR(
12345, 'fm99G999D00',
'NLS_NUMERIC_CHARACTERS = ''.,'''
) AS "r2",
TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL; 結果:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
ここでは、セッションのテリトリーをドイツに設定してから、TO_CHAR()を呼び出しました。 3回。
- 最初の呼び出しでは、セッションのNLSパラメータを使用します。これは、デフォルトのグループ区切り文字がピリオドであることを意味します。
- 2番目の呼び出しでは、独自の
NLS_NUMERIC_CHARACTERSを明示的に設定しました。 関数内からのパラメータ。この場合、グループ区切り文字をコンマに設定しました。 3回目の呼び出しで見られるように、これを行ってもセッションのNLSパラメータには影響しませんでした。 - 3番目の呼び出しは、最初の呼び出しと同じように、セッションのNLSパラメータを使用します。ご覧のとおり、グループの区切り文字と10進数は、2回目の呼び出しで行った(一時的な)変更の影響を受けていません。
ハードコードされたカンマ
数値にコンマを追加するもう1つの方法は、フォーマットモデルにコンマをハードコードすることです。
例:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL; 結果:
12,345.00
この場合、コンマとピリオドをハードコーディングしました。これを行うと、NLS_NUMERIC_CHARACTERSで設定されたグループセパレータが無視されます パラメータ。
複数のカンマ
フォーマットモデル内に複数のコンマやグループ区切り文字を含めることができます。
例:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL; 結果:
123,456,789.00
無効なカンマの配置
数値形式モデルでは、コンマまたはグループ区切り文字を10進文字またはピリオドの右側に表示することはできません。
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL; 結果:
Error report - ORA-01481: invalid number format model