8

オラクル 11.2.0.3.0、APEX 4.1.1.00.23。

アプリケーションで数値FM999999999990.000を形式で表示し、日付を英語形式で表示する必要がありますDD-MON-YYYY

アプリケーションの言語 (フランス語、スペイン語など) が変更される場合でも、数字 (グループの区切り記号にスペースやカンマは使用せず、小数点記号は-1254.010 ) と日付 (3英語の月名の最初の文字、つまり 12-FEB-2012 )。

使用しているグローバリゼーション属性は次のとおりです(アプリケーション ビルダー -> アプリケーション -> グローバリゼーション属性の編集)。

  • アプリケーションの主要言語:フランス語 (フランス) (fr)
  • アプリケーション言語の派生元:セッション
  • 申請日の形式: DD-MON-YYYY

期待どおりに動作させることができません... との代わりにとの-1254,01ような日付がまだ取得されます。APEXは、セッションを変更するための呼び出しを無視しているようです...12-FÉVR.-2012-1254.01012-FEB-2012

「初期化PL/SQLコード」属性(アプリケーション・ビルダー -> アプリケーション -> セキュリティ属性の編集)に次のコードを入力しようとしましたが、成功しませんでした:

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;

パラメータが変化しているかどうかを確認するために、次のクエリを含むレポートがあります。

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;

結果:

NLS パラメータの変更を報告しない

ご覧のとおり、ALTER SESSION呼び出しは何も変更しません...

「ヘッダーALTER SESSIONの前」アプリケーション プロセスで呼び出しを試行すると、セッションが変更されたように見えます (レポートは変更された値を表示します) が、レポートとアイテムの日付と数値の形式が正しくありません... 「形式マスク」を試しました。 「数値フィールド」アイテムの属性ですが、何も変わらないようです...

これを機能させる唯一の方法はALTER SESSION、APEX から呼び出す各 PL/SQL 関数を呼び出すことです。レポートには、「数値/日付形式」列属性を使用できます。

質問:アプリケーション全体のセッションの数値と日付のパラメーターを変更する方法はありますか?


編集 :

各ページで次のヘッダー前プロセスを実行すると:

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;

レポートは、セッションが変更されたことを示しています。

レポートの NLS パラメータ

次に、次の新しいテスト ページを作成しました。

  1. 上記のヘッダー処理前。
  2. NLS パラメータ値を表示するレポート。
  3. テーブルの 1 つからの日付と数値を示すレポート。
  4. 日付を取得するためのソース タイプが「SQL クエリ」のテキスト フィールド アイテム。
  5. 数値を取得するためのソース タイプが「SQL クエリ」の数値フィールド アイテム。
  6. htp.prn()テーブルから日付を取得する PL/SQL プロシージャを呼び出すアプリケーション プロセスを呼び出す JQuery にバインドされたボタンで、テキスト フィールド アイテムを入力します。
  7. テーブル内の 2 つのフィールドの挿入 (アプリケーション プロセスなどを使用) を行う JQuery にバインドされたボタン。

ページが読み込まれると、レポートはセッションが正しく変更されたことを示し、アイテムとレポートで正しい数値と日付の形式を取得しました。「挿入」ボタンは問題なく挿入を行います。

「getDate」ボタンをクリックして ajax 呼び出しを使用してデータベースから日付を取得すると、フランス語の形式で日付が取得されます。そして、「挿入」ボタンが失敗します(invalid date)。

JavaScript から値を取得する(パッケージ内の PL/SQL 関数を呼び出すオンデマンド アプリケーション プロセスへの ajax 呼び出しを行う)ことで問題が発生する理由について何か考えはありますか?

また、他の既存のページと同じように、同じヘッダー前プロセスを使用しても、レポートの形式が間違っているため、まだ奇妙です。同僚と一緒にこれをもっと調べなければなりません。おそらくどこかに「隠された」コードがあり、すべてが壊れています。

ページのデバッグ メッセージ データを確認しましたが、特に問題はありませんでした。

4

4 に答える 4

0

グローバリゼーション属性が言語間で「固執」していない理由を説明できないのは残念ですが、幸運にも心配する必要はありません。リテラルを入れるのではなく、ここで置換変数を使用してみましたか? これを修正する必要はありませんが、試してみる価値はありますよね? アプリケーション項目の値を設定して、これを少し試してみました:= SYSDATE. Application->Global Settings->Application Date Format を変更すると、ページ アイテムが存在するページを再表示するたびに、指定された形式が適用されます。

これとは別に、あなたのユーザーがアプリケーションの実行元である APEX_PUBLIC_USER スキーマのセッションを変更する権限を持っているとは想像しがたいです。つまり、DBA がその許可を与えるとは想像しがたいです。そのアカウントにとってはかなり危険に思えるからです。

また、Apex セッション (URL のセッション ID で示される) は Oracle セッションとは異なることに注意してください。したがって、上記の匿名ブロックは、実際には、上記のテスト ページで実行されている Oracle セッション内のセッションを変更できる可能性がありますが、データベースとの AJAX 呼び出しの会話は別の Oracle セッションで実行されます。したがって、「ALTER SESSION」はそれに影響しません。

この議論があなたの答えを見つけるのに役立つことを願っています. もしそうなら、私に小道具をください!:-)

于 2012-07-20T18:37:54.447 に答える
0

それがあなたの質問に答えるかどうかはわかりませんが、このリンクは私の一日を救ってくれました:

私の場合、フランスの環境があり、「アメリカの Oracle データベース」(ローカリゼーション) が必要です。セッションを作成するたびにsqlldr、フランスの NLS を使用していました (ただし、アメリカの NLS が必要でした)。

このページが消えた場合に備えて、このページのコピーを次に示します。



この手順に従ってNLS_LANG、Oracle データベースの環境変数を設定します。

NLS_LANGOracle データベースの環境変数を設定するには、NLS_LANG値を決定する必要があります。

次のコマンドを実行します。

SELECT * FROM V$NLS_PARAMETERS

形式の NLS_LANG 値を書き留めます[NLS_LANGUAGE]_[NLS_TERRITORY].[NLS_CHARACTERSET]

例: American_America.UTF8

Windows の場合:

  • に移動してControl Panel > System、 をクリックしますAdvanced tab。をクリックしEnvironment Variablesます。
  • System variablesセクションで、 をクリックしますNew
  • [変数名] フィールドに、 と入力しNLS_LANGます。
  • 「変数値」フィールドに、ステップ 1 で返された NLS_LANG 値を入力します (例: American_America.UTF8)。

UNIX の場合、次のように変数を設定します。

setenv NLS_LANG <NLS_LANG>

例えば:

setenv NLS_LANG American_America.UTF8.

データが 7 ビットまたは 8 ビット ASCII で、Informatica Server が UNIX で実行されている場合は、

NLS_LANG <NLS_LANGUAGE>_<NLS_TERRITORY>.WE8ISO8859P1

注意: この手順で説明されているように、NLS_LANG 変数を正しく設定していることを確認してください。そうしないと、データが正しく表示されません。

変数を作成したら、マシンを再起動します。

于 2014-06-27T13:25:59.980 に答える