Zahl-und Datums-format : eine änderung der NLS_SESSION_PARAMETER nicht funktioniert?
Oracle 11.2.0.3.0, APEX 4.1.1.00.23.
Müssen wir Anzeige zahlen in unserer Anwendung mit dem format FM999999999990.000
und Termine mit dem englischen format DD-MON-YYYY
.
Selbst wenn die Sprache der Anwendung ändern wird (Französisch, Spanien, etc.), wir müssen immer das format für zahlen (keine Leerzeichen oder Komma für Gruppen-Trennzeichen und einen Punkt für Dezimaltrennzeichen ie. -1254.010) und das Datum (erste 3 Buchstaben des englischen monatsnamens ie. 12-FEB-2012).
Hier sind Globalisierung Attribute wir verwenden (Application Builder -> Application -> Bearbeiten von Globalisierung Attribute) :
- Anwendung Hauptsprache: Französisch (Frankreich) (fr)
- Anwendung Sprache Abgeleitet: Sitzung
- Application Date Format: DD-MON-YYYY
Kann ich nicht verwalten, damit es funktioniert, wie erwartet...
Ich bekomme immer noch zahlen wie -1254,01
und Termine wie 12-FÉVR.-2012
statt -1254.010
und 12-FEB-2012
.
Es scheint APEX ignorieren, jeder Aufruf zum alter session...
Ich habe versucht, geben Sie den folgenden code in die "Initialisierung PL/SQL-Code" - Attribut (Application Builder -> Application -> Bearbeiten von Sicherheits-Attribute), aber ohne Erfolg :
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;
Habe ich einen Bericht mit der folgenden Abfrage, um zu sehen, ob die Parameter ändern sich :
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;
Ergebnis:
Wie Sie sehen ALTER SESSION
Anrufe nicht etwas ändern...
Wenn ich versuche ALTER SESSION
Anrufe in einem "Vor Header" - Bewerbung-session scheint nicht geändert werden (Bericht zeigen modifizierte Werte), aber ich bekomme immer noch falsche Datums-und Zahlenformat in meine Berichte und Artikel...
Ich habe versucht die "Format Maske" - Attribut des "Zahl-Feld" Elemente, aber es scheint nichts ändern zu...
Nur so kann ich es auf der Arbeit ist zu nennen ALTER SESSION
in jeder PL/SQL-Funktion, die ich aufrufen von APEX. Und für die Berichte, die ich verwenden können, die "Number /Date Format" - Spalte Attribut.
FRAGE: gibt es eine Möglichkeit, ich kann das ändern von Nummer und Datum Parameter für die Sitzung, die für die gesamte Anwendung ?
EDIT :
Wenn ich führen Sie die folgenden , Bevor Header-Prozess auf jeder Seite :
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;
Bericht zeigt, dass die session wurde geändert :
Dann habe ich eine neue test-Seite mit :
- Die oben genannten Vor-Header-Prozess.
- Einen Bericht, um zu zeigen, NLS-Parameter-Werte.
- Einen Bericht, der zeigen Datum und zahlen aus einer meiner Tabellen.
- Ein textfield-Elemente mit einer Quelle, die als Typ "SQL-Abfrage", um eine date.
- Ein Zahl-Feld Elements mit einer Quelle, die als Typ "SQL-Abfrage", um eine Nummer.
- Eine Taste gebunden mit JQuery, ruft eine Anwendung Prozess, der fordert, eine PL/SQL-Prozedur, die
htp.prn()
ein Datum aus einer Tabelle, dann füllen mein textfield-Element. - Eine Taste gebunden mit JQuery, die ein insert (mit Anwendung, Verfahren, usw.) die zwei Felder in einer Tabelle.
Sobald die Seite geladen wird, der Bericht zeigt, dass die session wurde geändert coorectly, und ich bekam Recht Zahl-und Datums-Formate, die in den items und in den Bericht. Die "insert" - button tun das einfügen ohne Probleme.
Wenn ich auf die "getDate" - button, um ein Datum aus der Datenbank mit einem ajax-Aufruf, bekomme ich das Datum im französischen format! Und dann die "insert" - Taste schlägt fehl (invalid date
).
Haben Sie eine Idee, warum die Werte aus JavaScript (macht einen ajax-call auf eine On-Demand-Application-Prozess für den Aufruf eines PL/SQL-Funktionen in einem Paket) das problem verursacht ?
Und es ist immer noch seltsam in meinen anderen vorhandenen Seiten, bekomme ich ein Falsches format im Bericht selbst, wenn ich denselben Vor-Header-Prozess. Wir haben, um mehr zu sehen, das mein Kollege, haben wir vielleicht eine "versteckte" Stück code irgendwo bricht alle.
Ich habe mir die debug-Meldung Daten für die Seite, aber nichts ungewöhnliches für mich.
Ich werde keine Zeit haben heute, aber ich kann versuchen, Anfang Nächster Woche. Danke.
Sorry für die Aufnahme so lange, um zurück zu Ihnen: ich habe versucht, dies mit nur nls_numeric_characters und ich weiß nicht scheinen, um keine Probleme mit dieser. Hat der Datenbank-Benutzer für das schema haben, Rechte zu ändern? Wenn Sie führen Sie die alter-Sitzungen von, sagen wir, sql developer, funktioniert es dann?
Es ist ein guter Beitrag mit vielen Informationen, die ich wünschte, ich könnte mehr helfen. Vielleicht versuchen Sie, stoßen Sie Ihre post auf OTN wieder? Mach ich nehme an, dass die ajax-Abruf ist, weil es eine weitere Sitzung, die auch genutzt wird. Ich würde nicht wirklich erwarten, Ihre vor-Header Prozess mit alter session zu tragen durch zu Ihrer Seite, die Verarbeitung auch, aber ich würde Lesen müssen, in apex + db-sessions-management, um wirklich zu wissen, wie das funktioniert. Es ist auch seltsam, dass Ihre Anwendung Eigenschaften>Sicherheitseinstellungen nicht wirksam für Sie, es Tat gut für mich.
Als fac586 sagt mir auf OTN, in der Tat Sicherheits-Einstellungen werden angewendet, aber sofort abgelöst durch die SESSION, Spracheinstellung, und das ist das Hauptproblem, denke ich. Eine Lösung ist die Ableitung der Sprache der Anwendung aus application Element FSP_LANGUAGE_PREFERENCE, anstatt der Sitzung. Ich habe getestet und alles ist in Ordnung. Aber ich bin mir sicher, dass es eine Lösung gibt, während die Sprache der Applikation abgeleitet aus der Sitzung. Ich werde weiter untersuchen 🙂
InformationsquelleAutor Yann39 | 2012-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tut mir Leid, ich kann Ihnen nicht sagen, warum gerade die Globalisierung Attribute sind nicht "kleben" in allen Sprachen, wie ich bin glücklich genug, um nicht um es sorgen. Haben Sie versucht, mit einer substitution variable hier anstatt der Literale in? Es sollte nicht dieses Problem zu lösen, aber es ist einen Versuch Wert, eh? Ich habe versucht, das Spiel mit diesem einen bit, der Wert für eine Anwendung, item := DATEPART. Wenn ich änderte den Anwendung->Globale Einstellungen->Application Date Format, es gelten würde, die das angegebene format jedes mal, wenn ich die Seite wieder angezeigt das Element auf der Seite war.
Getrennt, es ist schwer für mich vorstellbar, dass der Benutzer hat die Berechtigungen zu ändern, die Sitzung für die APEX_PUBLIC_USER-schema, auf dem die Anwendung ausgeführt wird. Das heißt, ich habe eine harte Zeit vorzustellen, dass ein DBA gewähren würde, dass die Erlaubnis, wie es scheint ziemlich gefährlich für das Konto.
Denken Sie auch daran, dass die Apex-Sitzungen (angegeben durch die session-ID in der URL) sind anders als die Oracle-Sitzungen. So Ihr anonymen block oben könnte tatsächlich in der Lage sein, zu ändern, die Sitzung innerhalb der Oracle-Sitzung läuft es in für die test-Seite, die Sie erwähnt, aber Sie AJAX-call Gespräch mit der Datenbank wird die Ausführung in einem anderen Oracle-Sitzung. Also das "ALTER SESSION" hätte keine Wirkung auf Sie.
Ich hoffe, dass diese Diskussion hilft, Sie finden Ihre Antwort. Wenn ja, bitte gib mir props! 🙂
InformationsquelleAutor StewS2
Ich weiß nicht, ob es beantwortet deine Frage, aber diesen link hat gerade meinen Tag gerettet :
In meinem Fall habe ich eine französische Umgebung, und ich brauche eine "amerikanische Oracle-Datenbank" (Lokalisierung). Jedes mal, wenn ich war das anlegen einer session für
sqlldr
ich hatte eine Französisch NLS (obwohl ich brauchte eine amerikanische).Hier ist eine Kopie dieser Seite, falls es verschwindet :
Folgen Sie dieser Prozedur, um die
NLS_LANG
Umgebungsvariablen für Oracle-Datenbanken.Um die
NLS_LANG
Umgebungsvariablen für Oracle-Datenbanken, die wir haben, um zu bestimmen, dieNLS_LANG
Wert.Führen Sie den Befehl :
Notieren Sie die NLS_LANG-Wert, der in das format
[NLS_LANGUAGE]_[NLS_TERRITORY].[NLS_CHARACTERSET]
.Beispiel: American_America.UTF8
Für Windows:
Control Panel > System
und klicken Sie auf dieAdvanced tab
. Klicken Sie aufEnvironment Variables
.System variables
Abschnitt, klicken Sie aufNew
.NLS_LANG
.American_America.UTF8
).Für UNIX, legen Sie die Variablen wie unten dargestellt:
Beispiel:
Wenn Ihre Daten in 7-bit oder 8-bit ASCII und die Informatica Server unter UNIX läuft, dann setzen
VORSICHT: Stellen Sie sicher, dass Sie die NLS_LANG-variable korrekt, wie in diesem Verfahren, oder Ihre Daten nicht korrekt angezeigt werden.
Neustart der Maschine nach dem erstellen der variable.
InformationsquelleAutor kmas
Arbeiten Sie mit diesem in einer Apex-Anwendung? Wenn ja, dann Teil von der Erstellung der Anwendung ist die Angabe, NLS die zugehörigen Werte. Apex wird immer überschreiben Ihre Einstellungen mit der Anwendung Einstellungen.
Ich immer die Erstellung von Anwendungen mit festen NLS-Werte, so bin ich sicher, dass Datumsangaben und zahlen werden richtig angezeigt.
Können Sie Apex-Schalter die NLS-Einstellungen (application Vorliebe, Element Vorliebe). Diejenigen, die gut funktionieren.
Aber Sie müssen es tun, auf der Anwendungsebene und nicht auf Datenbankebene.
InformationsquelleAutor Olafur Tryggvason