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):
我无法让它按预期工作......我仍然得到数字-1254,01和日期12-FÉVR.-2012而不是-1254.010和12-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)
结果:

如你所见,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)
报告显示会话已被更改:

然后我创建了一个新的测试页面:
htp.prn()该过程是一个表中的日期,然后填充我的textfield项.加载页面后,报告显示会话已被更改,并且我在项目和报告中获得了正确的数字和日期格式."插入"按钮执行插入没有任何问题.
当我点击"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”不会对其产生任何影响。
我希望这次讨论可以帮助您找到答案。如果是的话,请给我道具!:-)
| 归档时间: |
|
| 查看次数: |
31065 次 |
| 最近记录: |