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和日期这样的数字12-FÉVR.-2012而不是-1254.01012-FEB-2012。似乎 APEX 忽略了任何更改会话的调用...

我尝试在“初始化 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电话不会改变任何东西...

当我尝试在“ Before HeaderALTER SESSION ”应用程序流程中调用时,会话似乎被更改(报告显示修改后的值),但我的报告和项目中的日期和数字格式仍然错误......我尝试了“格式掩码” “数字字段”项目的属性,但它似乎也没有改变任何东西......

我可以让它工作的唯一方法是调用ALTER SESSION我从 APEX 调用的每个 PL/SQL 函数。对于报告,我可以使用“数字/日期格式”列属性。

问题:有什么方法可以更改整个应用程序会话的数字和日期参数?


编辑 :

当我在每个页面上运行以下Before Header 进程时:

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. 上面的Before Header过程。
  2. 显示 NLS 参数值的报告。
  3. 一份显示我的一张表中的日期和数字的报告。
  4. 源类型为“SQL 查询”的文本字段项以获取日期。
  5. 源类型为“SQL 查询”的数字字段项以获取数字。
  6. 一个与 JQuery 绑定的按钮,它调用一个应用程序进程,该进程调用一个 PL/SQL 过程,该过程htp.prn()从表中获取日期,然后填充我的文本字段项。
  7. 一个与 JQuery 绑定的按钮,用于插入(使用应用程序进程等)表中的两个字段。

加载页面后,报告显示会话已正确更改,并且我在项目和报告中获得了正确的数字和日期格式。“插入”按钮可以毫无问题地进行插入。

当我单击“getDate”按钮以使用 ajax 调用从数据库中获取日期时,我得到的是法语格式的日期!然后“插入”按钮失败(invalid date)。

您是否知道为什么从 JavaScript 获取值(对在包中调用 PL/SQL 函数的按需应用程序进程进行 ajax 调用)会导致问题?

并且在我的其他现有页面中仍然很奇怪,即使我使用相同的 Before Header 流程​​,我在报告中的格式也错误。我们必须和我的同事一起更多地研究这个问题,也许我们在某处有一段“隐藏”的代码会破坏一切。

我查看了页面的调试消息数据,但对我来说没什么奇怪的。

4

4 回答 4

1

您是否在 Apex 应用程序中使用它?如果是这样,则应用程序创建过程的一部分是指定 NLS 相关值。Apex 将始终使用应用程序设置覆盖您的设置。

在此处输入图像描述

我总是创建具有固定 NLS 值的应用程序,因此我确信日期和数字会正确显示。

您可以拥有 Apex 切换 NLS 设置(应用程序首选项、项目首选项)。那些工作得很好。

但是您需要在应用程序级别而不是数据库级别执行此操作。

于 2015-09-15T00:40:16.390 回答
1

从 apex-client 到服务器的每个调用都是单独的 oracle 会话。它回答了为什么你会通过 js 回调得到错误的格式。

你试过这个吗?

Application Express 会话语言可以通过APEX_UTIL.SET_SESSION_LANG过程或通过 URL 中 F 过程的P_LANG参数进行设置。

您也可以尝试将初始化代码放在这里:安全属性 -> 数据库会话 -> 初始化 PL/SQL 代码。但我不确定回调。

于 2019-05-21T06:45:18.220 回答
0

很抱歉,我不能告诉你为什么全球化属性没有“坚持”跨语言,因为我很幸运不必担心它。您是否尝试过在此处使用替换变量而不是将文字放入?它不应该解决这个问题,但值得一试,嗯?我尝试了一下,设置应用程序项的值:= SYSDATE。当我更改应用程序->全局设置->应用程序日期格式时,每次我重新显示页面项目所在的页面时,它都会应用指定的格式。

另外,我很难想象您的用户有权更改 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_LANG为 Oracle 数据库设置环境变量,我们必须确定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 回答