mardi 22 juin 2010

NLS_NUMERIC_CHARACTERS dans un environnement SPATIAL 11.2.0.1

J'aimerais partager avec vous un problème que nous avons rencontré avec le paramètre NLS_NUMERIC_CHARACTERS chez l'un de nos clients.

Le client utilise la fonctionnalité Spatial de la version 11.2.0.1 d'oracle database server.

Vous savez que la valeur du paramètre NLS_NUMERIC_CHARACTERS a une importance capitale pour les affichages de valeurs numériques par exemple.
À titre d'exemple, selon le pays dans lequel vous vous trouvez, $100,000 n'a pas la même valeur que $100.000.

Le problème que nous avons rencontré est le suivant:

Le client utilise la valeur «, » (virgule et espace) pour le nls_numeric_characters.
Mais après l'utilisation de certains opérateurs de SPATIAL tels que SDO_WITHIN_DISTANCE , SDO_RELATE ou la création d'index de type spatial (CREATE INDEX ... INDEXTYPE SPATIAL_INDEX)... je ne peux pas les énumérer tous ici..., la valeur du nls_numeric_characters change automatiquement pour devenir «.,» (point et virgule) dans la session de l'utilisateur. Ce qui a un impact catastrophique pour le client car toutes les opérations subséquentes utilisent la nouvelle valeur dans cette session.

Si vous rencontrez ce problème, il s'agit du bug 9824831.

Comment reproduire le problème?

1- Vérifier la valeur actuelle du nls_numeric_characters:
-- Pour voir le problème, il faut que la valeur du nls_numeric_characters soit différente de «.,» (point et virgule) au départ.

sqlplus hetche/hetche
select * from nls_session_parameters;


2- Si la valeur de votre nls_numeric_characters est égale à «.,» (point et virgule), la changer comme suit dans la même session, sinon sauter cette étape:

exec dbms_session.set_nls('nls_numeric_characters','", "');
-- La nouvelle valeur devrait être «, » (virgule espace)

3- Créer une table qui contient un champ de type spatial:

create table test_geomt ( champ_geo mdsys.sdo_geometry);

4- Créer par exemple un index de type spatial sur la table précédemment créée:
-- La création de l'index pourrait retourner des erreurs, mais ce n'est pas grave, le plus important c'est la tentative de création de l'index.

CREATE INDEX SEGRO_01_SIX ON test_geomt
(champ_GEO)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
PARAMETERS('tablespace=USERS')
NOPARALLEL;


5- Voir de nouveau la valeur du nls_numric_characters dans la même session que précédemment:

select * from nls_session_parameters;

Vous verrez que la valeur est devenue «.,» (point et virgule). La tentative de création d'un index de type spatial a modifié la valeur du nls_numeric_characters dans ma session.

On aurait obtenu le même résultat si on avait utilisé l'un des opérateurs cités précédemment (et bien d'autres que je n'ai pas cités).

Par exemple:

select * from test_geomt where sdo_within_distance(champ_geo, mdsys.sdo_geometry(2001,1557057,sdo_point_type(906132,494472,null),null,null),'DISTANCE =1')='TRUE' ;

Pour corriger ce problème, appliquer le patch 9824831

Aucun commentaire:

Enregistrer un commentaire