2 votes

Oracle NLS_SORT ne fonctionne pas au niveau du système

Je suis en train d'utiliser Oracle 11g r2, et j'essaie de configurer la base de données pour utiliser un tri linguistique. J'ai fait

alter system set NLS_SORT='RUSSIAN' SCOPE=SPFILE;
alter system set NLS_COMP='LINUGUISTIC' SCOPE=SPFILE;

après avoir redémarré Oracle, j'ai vérifié ces paramètres :

show parameters NLS_SORT;
show parameters NLS_COMP;

ça me montre les bonnes valeurs. Mais quand je fais un tri

select name from test order by name; 

ça me montre les résultats dans un ordre incorrect, c'est-à-dire d'abord les chiffres, puis les lettres.

mais si je fais

alter session set nls_sort='RUSSIAN';
alter session set nls_comp='LINGUISTIC';
select name from test order by name; 

ça me montre le bon ordre.

est-ce que quelqu'un sait pourquoi les changements système ne me montrent pas les bons résultats ?

2voto

Vous pouvez définir les paramètres NLS à différents niveaux

  1. En tant que paramètres d'initialisation sur l'instance/serveur.

    SQL> alter system set V$NLS_PARAMETER = 'XXX' scope = both;
  2. En tant que variables d'environnement sur le client.

    % setenv NLS_SORT FRENCH
  3. En tant que paramètres de session ALTER.

    SQL> ALTER SESSION SET V$NLS_PARAMETER =  = 'XXX'

Toute configuration remplace la configuration à un niveau supérieur. Donc, définir cela côté serveur ne garantit pas que la configuration est utilisée par tous les clients connectés.

Si vous voulez vous assurer qu'elle est définie pour chaque client connecté, utilisez un déclencheur de connexion. Même alors, un utilisateur peut remplacer explicitement la configuration "par défaut".

2voto

Alex Poole Points 43006

La priorité pour les paramètres de globalisation est indiquée dans la documentation. Vous définissez la priorité 4 dans cette liste, 'Spécifié dans le fichier de paramètres d'initialisation'. Vous ne définissez pas la priorité 1 ('Défini explicitement dans les fonctions SQL') et vous obtenez les résultats souhaités lorsque vous définissez la priorité 2 ('Défini par une instruction ALTER SESSION'). Par un processus d'élimination, cela indique que votre ordre 'non correct' est influencé par la priorité 3, 'Défini en tant que variable d'environnement'.

Vous pouvez vérifier les valeurs réellement utilisées par votre session avec select * from nls_session_parameters.

La variable d'environnement NLS_SORT n'est probablement pas définie directement; je soupçonne qu'elle est dérivée de NLS_LANGUAGE, qui est dérivée de NLS_LANG. Si vous ne définissez pas explicitement cela dans votre environnement d'exploitation, le client le définira en fonction du paramètre régional du système d'exploitation, en général, bien que le client exact que vous utilisez puisse faire une différence significative. Vous devrez peut-être définir explicitement une variable d'environnement NLS_COMP, si la valeur par défaut de la base de données pour cela est vraiment remplacée.

Par exemple, SQL Developer vous permet de spécifier les paramètres NLS dans les préférences (accessibles depuis Outils->Préférences->Base de données->NLS); les valeurs par défaut semblent être basées sur les paramètres du système d'exploitation, du moins sous Windows. Pour SQL*Plus, vous devrez définir des variables d'environnement du système d'exploitation.

Cela signifie également que si vous arrivez à le faire fonctionner à un endroit - les requêtes donnent le bon ordre lorsqu'elles sont exécutées depuis SQL Developer, par exemple - elles pourraient ne pas fonctionner ailleurs, par exemple via JDBC qui a ses propres paramètres régionaux. Juste quelque chose à surveiller.

Une approche brute-force pourrait consister à ajouter les commandes alter session à un déclencheur de connexion, mais cela ne semble pas idéal car cela masque simplement la configuration de l'environnement.

1voto

Frank Schmitt Points 13554

Vous avez une faute de frappe dans votre deuxième commande "ALTER SYSTEM" (LINUGUISTIC au lieu de LINGUISTIC).

Si votre commande réelle ne contient pas cette erreur, je vérifierais si votre client définit les paramètres de session NLS sur autre chose.

1voto

David Aldridge Points 27624

Indépendamment des paramètres du système, je ferais tout mon possible pour m'assurer que vos applications spécifient complètement l'environnement NLS dont elles ont besoin. C'est beaucoup plus robuste, surtout lorsque vous devez pointer le code de l'application vers différents environnements qui peuvent être nouvellement configurés ou partagés avec d'autres systèmes.

En fait, j'irais jusqu'à dire que vous pourriez être mieux de ne pas utiliser les paramètres d'environnement au niveau du système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X