Wanneer u de TO_CHAR()
. gebruikt functie om een getal in Oracle op te maken, gebruik je een formaatmodel om te bepalen hoe het getal moet worden opgemaakt.
U kunt bijvoorbeeld een getal opmaken als 12,345.00
of zoals 12,345.00
, afhankelijk van uw landinstelling.
Het formaatmodel kan de G
. bevatten of D
formaatelementen om een komma aan een getal toe te voegen. Welke je gebruikt hangt af van of je de komma als scheidingsteken voor duizendtallen of als decimaal teken wilt gebruiken.
U kunt ook een echt kommateken gebruiken (,
) als je wilt, hoewel deze methode niet locale-bewust is zoals de G
en D
formaatelementen zijn.
De G
en D
Opmaakelementen
Hier is een voorbeeld om de G
. te demonstreren en D
formaat elementen:
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Resultaat:
12,345.00
In dit geval voert het groepsscheidingsteken een komma uit en het decimale teken een punt. Dat komt omdat de NLS_TERRITORY
. van mijn huidige sessie parameter is ingesteld op Australia
.
Dit gebeurt er als ik mijn NLS_TERRITORY
wijzig parameter naar Germany
:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Resultaat:
12,345.00
Nu wordt de komma gebruikt voor het decimale teken.
Als een korte uitleg van het bovenstaande formaatmodel:
- De
fm
format modifier onderdrukt eventuele opvulling die op het resultaat kan worden toegepast. - De
9
tekens staan voor getallen. - De
0
karakter staat voor getallen zonder voorloop- of naloopnullen te onderdrukken.
Hier is een volledige lijst met elementen van getalnotatie die u als snelle referentie kunt gebruiken.
Thij NLS_NUMERIC_CHARACTERS
Parameter
Wanneer we de NLS_TERRITORY
. instellen parameter (zoals in het vorige voorbeeld), stelt dit impliciet een aantal andere parameters in, waaronder de NLS_NUMERIC_CHARACTERS
parameter.
Thij NLS_NUMERIC_CHARACTERS
parameter bepaalt welke tekens worden gebruikt voor het groepsscheidingsteken en het decimale teken.
We kunnen de V$NLS_PARAMETERS
. opvragen om te zien welke tekens worden gebruikt voor het groepsscheidingsteken en decimaalteken:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
Resultaat:
,.
Hier zien we dat het decimale teken wordt weergegeven door een komma en het groepsscheidingsteken wordt weergegeven door een punt.
U kunt de waarde van de NLS_NUMERIC_CHARACTERS
. wijzigen parameter rechtstreeks als u wilt (d.w.z. zonder de NLS_TERRITORY
. te wijzigen parameter).
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;
Resultaat:
12,345.00
Maar u moet dit waarschijnlijk vermijden, omdat het de verbinding tussen NLS-parameters verbreekt. Uw NLS-parameters weerspiegelen niet langer de standaardwaarden voor het huidige territorium. Tenzij je een goede reden hebt om dat niet te doen, is het meestal beter om de NLS_TERRITORY
te wijzigen parameter naar het relevante territorium, zodat andere parameters ook kunnen worden bijgewerkt naar hun standaardwaarde voor het nieuwe territorium.
De 'nlsparam'
Argument
Een ding dat ik moet vermelden is dat de T0_CHAR()
functie accepteert een derde argument waarmee u tijdelijk verschillende NLS-parameters kunt instellen, inclusief de NLS_NUMERIC_CHARACTERS
parameter. Als u dit op functieniveau doet, verandert dit niet de waarde van die parameters voor de huidige sessie.
Hier is een voorbeeld:
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;
Resultaat:
r1 r2 r3 ____________ ____________ ____________ 12.345,00 12,345.00 12.345,00
Hier stel ik het territorium van de sessie in op Duitsland en riep ik vervolgens TO_CHAR()
drie keer.
- De eerste aanroep gebruikt de NLS-parameters van de sessie. Dit betekent dat het standaard groepsscheidingsteken een punt is.
- In de tweede aanroep heb ik expliciet mijn eigen
NLS_NUMERIC_CHARACTERS
ingesteld parameter vanuit de functie. In dit geval stel ik het groepsscheidingsteken in op een komma. Dit had geen invloed op de NLS-parameters van mijn sessie, zoals blijkt uit de derde oproep. - De derde aanroep gebruikt de NLS-parameters van de sessie, net als de eerste aanroep. Zoals we kunnen zien, zijn het groepsscheidingsteken en het decimale teken niet beïnvloed door de (tijdelijke) wijziging die we hebben aangebracht in onze tweede oproep.
Hardgecodeerde komma
Een andere manier om een komma aan een getal toe te voegen, is door het in uw formaatmodel te hardcoderen.
Voorbeeld:
ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;
Resultaat:
12,345.00
In dit geval heb ik de komma en de punt hardgecodeerd. Als u dit doet, negeert u het groepsscheidingsteken dat is ingesteld in de NLS_NUMERIC_CHARACTERS
parameter.
Meerdere komma's
U kunt meerdere komma's en/of groepsscheidingstekens hebben binnen een formaatmodel.
Voorbeeld:
ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;
Resultaat:
123,456,789.00
Ongeldige kommaplaatsing
Een komma- of groepsscheidingsteken mag niet rechts van een decimaal teken of punt verschijnen in een model met getalnotatie.
SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;
Resultaat:
Error report - ORA-01481: invalid number format model