sql >> Databasteknik >  >> RDS >> Oracle

Hur du ändrar din sessions valutasymbol i Oracle

I Oracle Database finns det några olika NLS-parametrar som bestämmer hur valutan visas när du använder funktioner som TO_CHAR() för att formatera ett tal som en valuta.

  • NLS_CURRENCY anger strängen som ska användas som lokal valutasymbol för L nummerformatelement.
  • NLS_ISO_CURRENCY bestämmer vad som ska användas för C formatelement.
  • NLS_DUAL_CURRENCY anger vad som ska användas för U formatelement.

Standardvärdet för dessa bestäms av NLS_TERRITORY parameter.

Du kan ändra var och en av dessa parametrar individuellt om du vill, men i de flesta fall är det bättre att ändra NLS_TERRITORY parameter. Det beror på att det implicit ändrar alla andra valutaparametrar till deras standardvärden för det territoriet.

Återställ aktuella värden

Låt oss först fråga V$NLS_PARAMETERS visa för att ta reda på vilka våra standardvärden är:

SELECT 
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
    'NLS_TERRITORY',
    'NLS_CURRENCY',
    'NLS_ISO_CURRENCY',
    'NLS_DUAL_CURRENCY'    
    );

Resultat:

           PARAMETER        VALUE 
____________________ ____________ 
NLS_TERRITORY        AUSTRALIA    
NLS_CURRENCY         $            
NLS_ISO_CURRENCY     AUSTRALIA    
NLS_DUAL_CURRENCY    $           

Territoriet är Australien, och alla valutaparametrar använder standardvärdena för detta territorium.

Ändra alla valutasymboler

Låt oss ändra NLS_TERRITORY parameter till ett nytt värde:

ALTER SESSION SET NLS_TERRITORY = 'Denmark';

Resultat:

Session altered.

Låt oss nu kontrollera våra valuta-NLS-parametrar igen:

SELECT 
    PARAMETER,
    VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
    'NLS_TERRITORY',
    'NLS_CURRENCY',
    'NLS_ISO_CURRENCY',
    'NLS_DUAL_CURRENCY'    
    );

Resultat:

           PARAMETER      VALUE 
____________________ __________ 
NLS_TERRITORY        DENMARK    
NLS_CURRENCY         kr         
NLS_ISO_CURRENCY     DENMARK    
NLS_DUAL_CURRENCY    €          

Angående NLS_ISO_CURRENCY parameter, även om detta bestämmer vilken ISO-valutasymbol som ska användas, returneras inte den faktiska valutasymbolen här.

Följande exempel illustrerar vad jag menar:

SELECT 
    TO_CHAR(45, 'L99') AS "L",
    TO_CHAR(45, 'C99') AS "C",
    TO_CHAR(45, 'U99') AS "U"
FROM DUAL;

Resultat:

               L             C              U 
________________ _____________ ______________ 
         kr45         DKK45            €45   

Så även om NLS_ISO_CURRENCY parametern har värdet DENMARK , C formatelement returnerade DKK , som är den faktiska ISO-valutasymbolen för Danmark.

Ändra valutasymbolerna individuellt

Som nämnts kan du uttryckligen ställa in varje NLS-parameter individuellt.

Till exempel, efter att ha ställt in territoriet till Danmark i föregående exempel, kan vi nu åsidosätta vilken som helst (eller alla) valutasymbolerna genom att ställa in dem explicit:

ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';

Resultat:

Session altered.


Session altered.


Session altered.

Nu är det här vad vi får när vi kör den tidigare SELECT uttalande:

SELECT 
    TO_CHAR(45, 'L99') AS "L",
    TO_CHAR(45, 'C99') AS "C",
    TO_CHAR(45, 'U99') AS "U"
FROM DUAL;

Resultat:

               L             C                U 
________________ _____________ ________________ 
          $45         AUD45              $45   

Så även om vårt territorium förblir i Danmark, speglar våra valutasymboler ett annat territorium (i det här fallet Australien).

En sak att tänka på när du gör detta är att du kan hamna i en situation där dina valutaparametrar inte reflekterar andra parametrar, som NLS_NUMERIC_CHARACTERS (som bestämmer vilka tecken som ska användas för gruppavgränsare och decimaltecken).

Till exempel:

SELECT 
    TO_CHAR(4599.60, 'L99G999D99') AS "L",
    TO_CHAR(4599.60, 'C99G999D99') AS "C",
    TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;

Resultat:

                      L                    C                       U 
_______________________ ____________________ _______________________ 
           $4.599,60          AUD4.599,60               $4.599,60   

I det här fallet har vi australiska valutasymboler, men gruppavgränsaren är en punkt (. ) och decimaltecknet är ett kommatecken (, ), vilket inte återspeglar australiensiska konventioner (det återspeglar den konvention som används av Danmark). Australisk konvention är tvärtom – gruppseparatorn är ett kommatecken (, ) och decimaltecknet är en punkt (. ).

För att illustrera detta, här är vad vi får om vi helt enkelt återställer territoriet till Australien och sedan kör uttalandet igen:

ALTER SESSION SET NLS_TERRITORY = 'Australia';

SELECT 
    TO_CHAR(4599.60, 'L99G999D99') AS "L",
    TO_CHAR(4599.60, 'C99G999D99') AS "C",
    TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;

Resultat:

                      L                    C                       U 
_______________________ ____________________ _______________________ 
           $4,599.60          AUD4,599.60               $4,599.60    

  1. Varför ger denna SQL-kod fel 1066 (Inte unik tabell/alias:'användare')?

  2. Ändringar av Oracle-gränssnittet

  3. Fördjupad undersökning av säkerhet på radnivå

  4. Skillnad mellan numerisk, float och decimal i SQL Server