Dans Oracle Database, il existe quelques paramètres NLS différents qui déterminent l'affichage de la devise lors de l'utilisation de fonctions telles que TO_CHAR()
pour formater un nombre en tant que devise.
NLS_CURRENCY
spécifie la chaîne à utiliser comme symbole de devise locale pour leL
élément de format numérique.NLS_ISO_CURRENCY
détermine quoi utiliser pour leC
élément de format.NLS_DUAL_CURRENCY
spécifie ce qu'il faut utiliser pour leU
élément de format.
La valeur par défaut pour ceux-ci est déterminée par le NLS_TERRITORY
paramètre.
Vous pouvez modifier chacun de ces paramètres individuellement si vous le souhaitez, mais dans la plupart des cas, il est préférable de modifier le NLS_TERRITORY
paramètre. En effet, cela modifie implicitement tous les autres paramètres de devise à leurs valeurs par défaut pour ce territoire.
Renvoyer les valeurs actuelles
Commençons par interroger le V$NLS_PARAMETERS
view pour connaître nos valeurs par défaut :
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Résultat :
PARAMETER VALUE ____________________ ____________ NLS_TERRITORY AUSTRALIA NLS_CURRENCY $ NLS_ISO_CURRENCY AUSTRALIA NLS_DUAL_CURRENCY $
Le territoire est l'Australie et tous les paramètres de devise utilisent les valeurs par défaut pour ce territoire.
Modifier tous les symboles monétaires
Changeons le NLS_TERRITORY
paramètre à une nouvelle valeur :
ALTER SESSION SET NLS_TERRITORY = 'Denmark';
Résultat :
Session altered.
Vérifions à nouveau nos paramètres NLS de devise :
SELECT
PARAMETER,
VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER IN (
'NLS_TERRITORY',
'NLS_CURRENCY',
'NLS_ISO_CURRENCY',
'NLS_DUAL_CURRENCY'
);
Résultat :
PARAMETER VALUE ____________________ __________ NLS_TERRITORY DENMARK NLS_CURRENCY kr NLS_ISO_CURRENCY DENMARK NLS_DUAL_CURRENCY €
Concernant le NLS_ISO_CURRENCY
paramètre, bien que cela détermine le symbole monétaire ISO à utiliser, le symbole monétaire réel n'est pas renvoyé ici.
L'exemple suivant illustre ce que je veux dire :
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Résultat :
L C U ________________ _____________ ______________ kr45 DKK45 €45
Ainsi, même si le NLS_ISO_CURRENCY
le paramètre a une valeur de DENMARK
, le C
élément de format renvoyé DKK
, qui est le véritable symbole monétaire ISO du Danemark.
Modifier les symboles monétaires individuellement
Comme mentionné, vous pouvez définir explicitement chaque paramètre NLS individuellement.
Par exemple, après avoir défini le territoire sur le Danemark dans l'exemple précédent, nous pouvons maintenant remplacer n'importe lequel (ou tous) des symboles monétaires en les définissant explicitement :
ALTER SESSION SET NLS_CURRENCY = '$';
ALTER SESSION SET NLS_ISO_CURRENCY = 'AUSTRALIA';
ALTER SESSION SET NLS_DUAL_CURRENCY = '$';
Résultat :
Session altered. Session altered. Session altered.
Voici maintenant ce que nous obtenons lors de l'exécution du précédent SELECT
déclaration :
SELECT
TO_CHAR(45, 'L99') AS "L",
TO_CHAR(45, 'C99') AS "C",
TO_CHAR(45, 'U99') AS "U"
FROM DUAL;
Résultat :
L C U ________________ _____________ ________________ $45 AUD45 $45
Ainsi, même si notre territoire reste au Danemark, nos symboles monétaires reflètent un territoire différent (dans ce cas, l'Australie).
Une chose à garder à l'esprit lors de cette opération est que vous pourriez vous retrouver dans une situation où vos paramètres de devise ne reflètent pas d'autres paramètres, tels que NLS_NUMERIC_CHARACTERS
(qui détermine les caractères à utiliser pour le séparateur de groupe et le caractère décimal).
Par exemple :
SELECT
TO_CHAR(4599.60, 'L99G999D99') AS "L",
TO_CHAR(4599.60, 'C99G999D99') AS "C",
TO_CHAR(4599.60, 'U99G999D99') AS "U"
FROM DUAL;
Résultat :
L C U _______________________ ____________________ _______________________ $4.599,60 AUD4.599,60 $4.599,60
Dans ce cas, nous avons des symboles monétaires australiens, mais le séparateur de groupe est un point (.
) et le caractère décimal est une virgule (,
), qui ne reflète pas les conventions australiennes (elle reflète la convention utilisée par le Danemark). La convention australienne est l'inverse - le séparateur de groupe est une virgule (,
) et le caractère décimal est un point (.
).
Pour illustrer cela, voici ce que nous obtenons si nous réinitialisons simplement le territoire sur l'Australie, puis exécutons à nouveau l'instruction :
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;
Résultat :
L C U _______________________ ____________________ _______________________ $4,599.60 AUD4,599.60 $4,599.60