数字和日期格式:更改NLS_SESSION_PARAMETER不起作用?

Yan*_*n39 7 session nls number-formatting date-formatting oracle-apex

Oracle 11.2.0.3.0,APEX 4.1.1.00.23.

我们需要在我们的应用程序中显示数字,格式FM999999999990.000日期格式为英文DD-MON-YYYY.

即使应用程序语言将要改变(法语,西班牙等),我们总是需要这种格式的数字(组分隔符没有空格或逗号,小数分隔符的点,即-1254.010)和日期(3)英文月份名称的第一个字母,即12-FEB-2012).

以下是我们正在使用的全球化属性(Application Builder - > Application - > Edit Globalization Attributes):

  • 应用小学语言:法语(法国)(fr)
  • 应用程序语言派生自:Session
  • 申请日期格式: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;
Run Code Online (Sandbox Code Playgroud)

我有一个报告与以下查询,以查看参数是否正在更改:

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;
Run Code Online (Sandbox Code Playgroud)

结果:

报告NLS参数无变化

如你所见,ALTER SESSION电话不会改变任何东西......

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

我可以让它工作的唯一方法是调用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;
Run Code Online (Sandbox Code Playgroud)

报告显示会话已被更改:

报告NLS参数

然后我创建了一个新的测试页面:

  1. 上面的前标题过程.
  2. 显示NLS参数值的报告.
  3. 一个报告,显示我的一个表格中的日期和数字.
  4. 获取日期的源类型为"SQL查询"的文本字段项.
  5. 一个Number字段项,其源类型为"SQL Query"以获取数字.
  6. 一个绑定了JQuery的按钮,它调用一个应用程序进程,该进程调用一个PL/SQL过程,htp.prn()该过程是一个表中的日期,然后填充我的textfield项.
  7. 与JQuery绑定的按钮,用于对表中的两个字段执行插入(使用应用程序进程等).

加载页面后,报告显示会话已被更改,并且我在项目和报告中获得了正确的数字和日期格式."插入"按钮执行插入没有任何问题.

当我点击"getDate"按钮使用ajax调用从数据库中获取日期时,我会以法语格式获取日期!然后"插入"按钮失败(invalid date).

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

它仍然很奇怪,因为在我的其他现有页面中,即使我使用相同的Before Header过程,我在报告中也会出现错误的格式.我们不得不与我的同事一起研究这个问题,也许我们在某个地方有一个"隐藏"的代码片段会破坏所有代码.

我查看了页面的调试消息数据,但对我来说并不奇怪.

小智 0

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

另外,我很难想象您的用户有权更改 APEX_PUBLIC_USER 模式的会话,这是您的应用程序运行的位置。也就是说,我很难想象 DBA 会授予该权限,因为这对于该帐户来说似乎非常危险。

另外,请记住,Apex 会话(如 URL 中的会话 ID 所示)与 Oracle 会话不同。因此,上面的匿名块实际上可能能够更改它在上面提到的测试页中运行的 Oracle 会话中的会话,但是与数据库的 AJAX 调用对话将在不同的 Oracle 会话中运行。所以“ALTER SESSION”不会对其产生任何影响。

我希望这次讨论可以帮助您找到答案。如果是的话,请给我道具!:-)