【发布时间】:2012-06-23 14:00:58
【问题描述】:
Oracle 11.2.0.3.0、APEX 4.1.1.00.23。
我们需要在应用中显示数字,格式为FM999999999990.000,日期,格式为英文DD-MON-YYYY。
即使应用程序语言要改变(法语、西班牙等),我们总是需要这种格式的数字(组分隔符没有空格或逗号,小数分隔符用点,即。- 1254.010)和日期(英文月份名称的三个首字母即 12-FEB-2012)。
这是我们正在使用的全球化属性(Application Builder -> Application -> Edit Globalization Attributes):
- 应用程序主要语言:法语(法国)(fr)
- 应用程序语言派生自:会话
- 申请日期格式:DD-MON-YYYY
我无法让它按预期工作......
我仍然得到像-1254,01 这样的数字和像12-FÉVR.-2012 这样的日期,而不是-1254.010 和12-FEB-2012。
似乎 APEX 忽略了任何更改会话的调用...
我尝试在“初始化 PL/SQL 代码”属性(Application Builder -> Application -> Edit Security Attributes)中输入以下代码,但没有任何成功:
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;
结果:
如您所见,ALTER SESSION 调用不会改变任何东西...
当我在“Before Header”应用程序进程中尝试ALTER SESSION 调用时,会话似乎已更改(报告显示修改后的值),但我的报告中仍然出现错误的日期和数字格式和物品...
我已经尝试过“Number Field”项目的“Format Mask”属性,但它似乎也没有改变任何东西......
我可以让它工作的唯一方法是在我从 APEX 调用的每个 PL/SQL 函数中调用 ALTER SESSION。对于报告,我可以使用“数字/日期格式”列属性。
问题:有什么方法可以更改整个应用程序的会话的数字和日期参数?
编辑:
当我在每个页面上运行以下 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;
报告显示会话已更改:
然后我创建了一个新的测试页面:
- 上述Before Header流程。
- 显示 NLS 参数值的报告。
- 一份显示我的一张表格中的日期和数字的报告。
- 源类型为“SQL 查询”的文本字段项以获取日期。
- 源类型为“SQL 查询”的数字字段项以获取数字。
- 一个与 JQuery 绑定的按钮,它调用一个应用程序进程,该进程调用一个 PL/SQL 过程,
htp.prn()来自表的日期,然后填充我的文本字段项。 - 一个与 JQuery 绑定的按钮,用于插入(使用应用程序进程等)表中的两个字段。
加载页面后,报告显示会话已正确更改,并且我在项目和报告中获得了正确的数字和日期格式。 “插入”按钮可以毫无问题地进行插入。
当我单击“getDate”按钮以使用 ajax 调用从数据库中获取日期时,我得到的是法语格式的日期!然后“插入”按钮失败(invalid date)。
您知道为什么从 JavaScript 获取值(对调用包中的 PL/SQL 函数的按需应用程序进程进行 ajax 调用)会导致问题吗?
这仍然很奇怪,就像在我的其他现有页面中一样,即使我使用相同的 Before Header 流程,我在报告中的格式也会出错。我们必须和我的同事一起进一步研究这个问题,也许我们在某个地方有一段“隐藏”的代码会破坏一切。
我查看了页面的调试消息数据,但对我来说没有什么奇怪的。
【问题讨论】:
-
您能否在 apex.oracle.com 上尝试一下,看看它的反应如何?我也会尝试在我的环境中试一试。
-
今天没时间,下周初可以试一试。谢谢。
-
很抱歉这么久才回复你:我只用 nls_numeric_characters 试过这个,我似乎没有遇到任何问题。您的架构数据库用户是否有权更改?如果你从 sql 开发者那里运行 alter session,它会起作用吗?
-
这是一篇包含大量信息的好帖子,我希望我能提供更多帮助。也许尝试再次在 OTN 上发布您的帖子?我确实认为 ajax 检索是因为它是另一个使用它的会话。我实际上并没有期望您使用 alter session 的前标头进程也可以进行页面处理,但是我需要阅读 apex + db 会话管理才能真正了解它是如何工作的。你的应用程序属性>安全设置对你不起作用,这对我来说很好。
-
正如 fac586 在 OTN 上告诉我的那样,实际上应用了安全设置但立即被会话语言设置取代,这是我认为的主要问题。一种解决方案是从应用程序项 FSP_LANGUAGE_PREFERENCE 而不是 Session 派生应用程序语言。我已经测试过,一切正常。但是我确信有一个解决方案,同时保留从会话派生的应用程序语言。我会继续调查:)
标签: session oracle-apex number-formatting date-formatting nls