Nombre et le format de la date : la modification de NLS_SESSION_PARAMETER ne fonctionne pas?
Oracle 11.2.0.3.0, APEX 4.1.1.00.23.
Nous avons besoin pour afficher numéros de dans notre application avec le format FM999999999990.000
et dates avec le format anglais DD-MON-YYYY
.
Même si la langue de l'application va changer (en français, en espagne, etc.), nous avons toujours besoin de ce format pour les nombres (pas d'espace ou une virgule pour séparateur de groupe, et un point comme séparateur décimal, ie. -1254.010) et la date (3 premières lettres du nom du mois en anglais ie. 12-FEB-2012).
Voici la mondialisation attributs nous utilisons (Application Builder ->- > Modifier les Attributs de la Mondialisation) :
- Application Langue Principale: français (France) (fr)
- La Langue De L'Application Dérivée De: Session
- Application Format de la Date: DD-MON-YYYY
Je n'arrive pas à le faire fonctionner comme prévu...
Je reçois encore des chiffres comme -1254,01
et les dates comme 12-FÉVR.-2012
au lieu de -1254.010
et 12-FEB-2012
.
Il semble APEX ignorer tout appel à alter session...
J'ai essayé d'entrer le code suivant dans le "Initialisation du Code PL/SQL" attribut (Application Builder ->- > Modifier les Attributs de Sécurité), mais sans succès :
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS= ''.,'' ';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_LANGUAGE = ''AMERICAN'' ';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = ''AMERICAN'' ';
END;
J'ai un rapport avec la requête suivante pour voir si les paramètres sont en train de changer :
SELECT
a1.parameter as "Parameter",
a1.value as "Database value",
a2.value as "Instance value",
a3.value as "Session value"
FROM
nls_database_parameters a1
LEFT JOIN nls_instance_parameters a2 ON a1.parameter = a2.parameter
LEFT JOIN nls_session_parameters a3 ON a1.parameter = a3.parameter
ORDER BY
a1.parameter asc;
Résultat:
Comme vous le voyez ALTER SESSION
appels ne changez rien...
Quand j'essaie ALTER SESSION
appels dans un "Avant d'en-Tête" processus de demande, de la session semble être altérée (rapport, les valeurs modifiées), mais j'ai toujours mauvaise date et le format de nombre dans mes rapports et articles...
J'ai essayé le "Masque de Format" de l'attribut "Champ Numéro de" éléments, mais il semble qu'il ne change pas quelque chose de trop...
La seule façon dont je peux l'obtenir pour fonctionner est d'appeler ALTER SESSION
dans chaque fonction PL/SQL-je appeler à partir de l'APEX. Et pour les rapports, je peux utiliser le "Nombre /Format de la Date" de colonne d'attribut.
QUESTION: Est-il possible que je peux modifier le numéro et la date des paramètres de la session pour l'ensemble de l'application ?
EDIT :
Quand je lance le suivant Avant d'en-Tête de processus sur chaque page :
BEGIN
APEX_UTIL.SET_SESSION_LANG('fr');
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS= ''.,'' ';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_LANGUAGE = ''AMERICAN'' ';
END;
le rapport montre que la session a été modifié :
Puis j'ai créé une nouvelle page de test avec :
- Ci-dessus Avant d'en-Tête de processus.
- Un rapport pour montrer NLS valeurs de ces paramètres.
- Un rapport qui date du spectacle et des numéros à partir de l'une de mes tables.
- Un textfield des éléments avec une Source de Type "Requête SQL" pour obtenir une date.
- Un Numéro d'élément de champ avec un Type de Source de "Requête SQL" pour obtenir un nombre.
- Un bouton lié avec JQuery qui appelle un processus de demande qui appelle une PL/SQL procédure
htp.prn()
une date à partir d'une table, puis de remplir mon textfield élément. - Un bouton lié avec JQuery que faire d'un insert (à l'aide de processus de demande, etc.) des deux champs dans une table.
Une fois que la page est chargée, le rapport montre que la session a été modifié coorectly, et j'ai eu bon nombre et les formats de date, dans les articles et dans le rapport. Le bouton "insérer" ne l'insertion sans aucun problème.
Quand je clique sur le "getDate" bouton pour obtenir une date à partir de la base de données à l'aide d'un appel ajax, je reçois de la date en français format! Et puis le bouton "insérer" échoue (invalid date
).
Avez-vous une idée sur les raisons de l'obtention de valeurs à partir de JavaScript (faire un appel ajax à une demande de la Demande Processus qui appelle une fonction PL/SQL dans un package) les causes du problème ?
Et il est toujours étrange que dans mes autres pages existantes, je reçois un mauvais format dans le rapport, même si j'utilise les mêmes Avant d'en-Tête de processus. Nous devons examiner de plus dans ce avec ma collègue, nous avons peut-être "caché" bout de code quelque part qui casse tout.
J'ai regardé le message de débogage les données de la page mais rien d'étrange pour moi.
Je ne vais pas avoir le temps aujourd'hui, mais je peux donner un essai en début de semaine prochaine. Merci.
Désolé pour tant de temps pour revenir à vous: j'ai essayé avec juste nls_numeric_characters et je n'ai pas à sembler obtenir des problèmes. Est-ce que votre base de données utilisateur pour le schéma de droits à modifier? Si vous exécutez la commande alter séances à partir de, disons, sql developer, ça marche alors?
C'est un bon post avec beaucoup d'informations, je souhaite que je pourrais aider plus. Peut-être essayer de se cogner ton post sur OTN de nouveau? Je ne suppose que l'ajax d'extraction est parce que c'est une autre session qui est utilisé pour cela. Je ne serais pas attendu à ce que votre avant-les en-têtes de processus avec alter session à transporter grâce à votre page de traitement trop, mais j'avais besoin de lire dans l'apex + db la gestion des sessions de savoir vraiment comment ça fonctionne. C'est aussi bizarre que votre application propriétés>paramètres de sécurité ne pas prendre l'effet pour vous, il s'en est très bien pour moi.
Comme fac586 me dit sur OTN, en fait, les paramètres de sécurité sont appliquées, mais immédiatement remplacée par la SESSION réglage de la Langue, et c'est le principal problème je pense. Une solution consiste à dériver la langue de l'application, de l'application de l'élément de FSP_LANGUAGE_PREFERENCE au lieu de la Session. J'ai testé et tout fonctionne bien. Cependant, je suis sûr qu'il y est une solution tout en gardant la langue de l'application dérivée de la session. Je vais poursuivre l'enquête 🙂
OriginalL'auteur Yann39 | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Je suis désolé, je ne peux pas vous dire au juste pourquoi la Mondialisation Attributs ne sont pas "coller" à travers les langues, comme j'ai de la chance de ne pas avoir à s'en soucier. Avez-vous essayé d'utiliser une variable de substitution ici plutôt que de mettre le littéral? Il ne devrait pas résoudre ce problème, mais il vaut la peine un coup, hein? J'ai essayé de jouer avec un peu tout ça, la définition de la valeur d'un élément d'application := SYSDATE. Quand j'ai changé de l'Application->Paramètres->Format de Date, il devrait appliquer le format spécifié à chaque fois que je réaffiche la page de l'élément de la page est sur.
Séparément, il est difficile pour moi d'imaginer que votre utilisateur a des privilèges de modifier la session pour le APEX_PUBLIC_USER schéma, qui est l'endroit où votre application est exécutée. C'est, j'ai du mal à imaginer qu'un DBA serait accorder cette autorisation, comme il semble assez dangereux pour ce compte.
Aussi, n'oubliez pas que l'Apex des sessions (comme indiqué par l'ID de session dans l'URL) sont différents de Oracle. Si votre bloc anonyme ci-dessus peuvent être réellement en mesure de modifier la session dans l'Oracle de la session de fonctionnement pour la page de test que vous avez mentionné ci-dessus, mais vous appel AJAX conversation avec la base de données sera exécuté dans un autre Oracle de la session. De sorte que le "ALTER SESSION' aurait aucun effet sur elle.
J'espère que cette discussion vous permet de trouver votre réponse. Si oui, veuillez me donner des accessoires! 🙂
OriginalL'auteur StewS2
Je ne sais pas si cela répond à votre question, mais ce lien a juste sauvé ma journée :
Dans mon cas , j'ai un environnement en français et j'ai besoin d'un "Américain Oracle base de données" (localisation). Chaque fois que j'étais en train de créer une session pour
sqlldr
j'ai eu un français NLS (bien que j'avais besoin d'un Américain).Voici une copie de cette page, dans le cas où il disparaît :
Suivez cette procédure pour définir la
NLS_LANG
variable d'environnement pour les bases de données Oracle.Pour définir la
NLS_LANG
variable d'environnement pour les bases de données Oracle, nous devons déterminer laNLS_LANG
valeur.Exécutez la commande :
Faire une note de la NLS_LANG valeur, qui est dans le format
[NLS_LANGUAGE]_[NLS_TERRITORY].[NLS_CHARACTERSET]
.Par exemple: American_America.UTF8
Pour Windows:
Control Panel > System
et cliquez sur leAdvanced tab
. Cliquez surEnvironment Variables
.System variables
section, cliquez surNew
.NLS_LANG
.American_America.UTF8
).Pour UNIX, définissez la variable, comme indiqué ci-dessous:
Par exemple:
Si vos données 7 bits ou 8 bits ASCII et le Informatica Serveur est en cours d'exécution sur UNIX, puis définissez
ATTENTION: assurez-vous de définir le NLS_LANG variable correctement, comme indiqué dans la présente procédure, ou vos données ne seront pas affichés correctement.
Redémarrage de la machine après la création de la variable.
OriginalL'auteur kmas
Travaillez-vous avec cette une de l'Apex de l'application? Si oui, alors le cadre de l'application du processus de création est en spécifiant NLS valeurs liées. Apex sera toujours remplacer vos paramètres avec les paramètres de l'application.
J'ai toujours de créer des applications fixes NLS valeurs et je suis sûr que les dates et les chiffres ne s'affichent pas correctement.
Vous pouvez avoir l'Apex de l'interrupteur NLS paramètres d'application (de préférence, l'élément de préférence). Ceux qui fonctionnent tout aussi bien.
Mais vous devez le faire au niveau de l'application et pas de niveau base de données.
OriginalL'auteur Olafur Tryggvason