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

时间:2012-06-21 10:42:17

标签: session oracle-apex number-formatting date-formatting nls

Oracle 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;

结果:

report NLS parameters no changes

如您所见,ALTER SESSION来电不会改变任何内容......

当我在“在标题之前”申请流程中尝试ALTER SESSION次来电时,会话似乎被更改了(报告显示修改后的值),但我仍然得到错误的日期和数字格式我的报告和项目...... 我尝试了“数字字段”项目的“格式掩码”属性,但它似乎也没有改变任何内容......

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

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


编辑:

当我在每个页面上运行以下标题处理前时:

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;

报告显示会话已被更改:

report NLS parameters

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

  1. 上面的标题处理过程。
  2. 显示NLS参数值的报告。
  3. 从我的某个表格中显示日期和数字的报告。
  4. 具有“源类型”为“SQL查询”的文本字段项,以获取日期。
  5. 一个数字字段项,其源类型为“SQL查询”以获取数字。
  6. 一个绑定了JQuery的按钮,它调用一个调用PL / SQL过程的应用程序进程htp.prn()表中的日期,然后填充我的文本字段项。
  7. 与JQuery绑定的按钮,用于对表中的两个字段执行插入(使用应用程序进程等)。
  8. 加载页面后,报告会显示会话已被更改,并且我在项目和报告中获得了正确的数字和日期格式。 “插入”按钮可以毫无问题地进行插入。

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

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

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

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

4 个答案:

答案 0 :(得分:0)

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

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

另外,请记住,Apex会话(由URL中的会话ID指示)与Oracle会话不同。因此,上面的匿名块实际上可以改变它在上面提到的测试页面运行的Oracle会话中的会话,但是您与数据库的AJAX调用会话将在不同的Oracle会话中运行。所以'ALTER SESSION'对它没有任何影响。

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

答案 1 :(得分:0)

我不知道它是否回答了你的问题,但这个链接刚刚结束了我的一天:

就我而言,我有一个法国环境,我需要一个“美国Oracle数据库”(本地化)。每次我为sqlldr创建一个会话时,我都有一个法语NLS(虽然我需要一个美国的NLS)。

以下是此页面的副本,以防它消失:



按照此过程为Oracle数据库设置NLS_LANG环境变量。

要为Oracle数据库设置NLS_LANG环境变量,我们必须确定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变量,否则您的数据将无法正确显示。

创建变量后重新启动计算机。

答案 2 :(得分:0)

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

enter image description here

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

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

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

答案 3 :(得分:0)

从apex客户端到服务器的每个调用都是单独的oracle会话。 它回答了为什么您通过js回调获取错误的格式。

您尝试过吗?

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

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