Oracle 11.2.0.3.0,APEX 4.1.1.00.23。
我们需要在我们的应用程序中使用格式FM999999999990.000
和日期以英文格式DD-MON-YYYY
显示数字。
即使应用程序语言会发生变化(法语,西班牙等),我们也总是需要这种数字格式(组分隔符没有空格或逗号,小数分隔符的点,即 - 1254.010 )和日期(英文月份名称中的3个首字母即12-FEB-2012 )。
以下是我们正在使用的全球化属性(应用程序生成器 - >应用程序 - >编辑全球化属性):
我无法让它按预期工作......
我仍然会获得-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;
我有一个包含以下查询的报告,以查看参数是否正在更改:
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
来电不会改变任何内容......
当我在“在标题之前”申请流程中尝试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;
报告显示会话已被更改:
然后我创建了一个新的测试页面:
htp.prn()
表中的日期,然后填充我的文本字段项。加载页面后,报告会显示会话已被更改,并且我在项目和报告中获得了正确的数字和日期格式。 “插入”按钮可以毫无问题地进行插入。
当我点击“getDate”按钮使用ajax调用从数据库中获取日期时,我会以法语格式获取日期!然后“插入”按钮失败(invalid date
)。
您是否知道为什么从JavaScript获取值(对调用包中的PL / SQL函数的随需应变程序进行ajax调用)会导致问题?
它仍然很奇怪,因为在我的其他现有页面中,即使我使用相同的Before Header过程,我在报告中也会出现错误的格式。我们不得不与我的同事一起研究这个问题,也许我们在某个地方有一段“隐藏”的代码会打破这一切。
我查看了页面的调试消息数据,但对我来说并不奇怪。
答案 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)。
以下是此页面的副本,以防它消失:
NLS_LANG
环境变量。要为Oracle数据库设置NLS_LANG
环境变量,我们必须确定NLS_LANG
值。
运行命令:
SELECT * FROM V$NLS_PARAMETERS
记下NLS_LANG值,格式为[NLS_LANGUAGE]_[NLS_TERRITORY].[NLS_CHARACTERSET]
。
例如: American_America.UTF8
Control Panel > System
,然后点击Advanced tab
。点击Environment Variables
。System variables
部分,点击New
。NLS_LANG
。American_America.UTF8
)。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将始终使用应用程序设置覆盖您的设置。
我总是创建具有固定NLS值的应用程序,因此我确信日期和数字将正确显示。
您可以使用Apex切换NLS设置(应用程序首选项,项目首选项)。那些工作很好。
但是您需要在应用程序级别而不是数据库级别执行此操作。
答案 3 :(得分:0)
从apex客户端到服务器的每个调用都是单独的oracle会话。 它回答了为什么您通过js回调获取错误的格式。
您尝试过吗?
可以通过 APEX_UTIL.SET_SESSION_LANG 过程或通过URL中F过程的 P_LANG 参数来设置Application Express会话语言。
也可以尝试将初始化代码放在此处:安全属性->数据库会话->初始化PL / SQL代码。但是我不确定回调。