ALTER SESSION SET nls_date_format 在 APEX 中不起作用。但是在 SQL Developer 中工作
Posted
技术标签:
【中文标题】ALTER SESSION SET nls_date_format 在 APEX 中不起作用。但是在 SQL Developer 中工作【英文标题】:ALTER SESSION SET nls_date_format doesn't work in APEX. However works in SQL Developer 【发布时间】:2019-10-20 00:33:57 【问题描述】:我尝试在 Oracle Application Express 中使用 ALTER SESSION SET nls_date_format 语句更改 nsl 参数,但参数保持不变。
但是在 Oracle SQL Developer 中我可以更改它们。
我想知道为什么。
我发现这个线程 Number and date format : altering NLS_SESSION_PARAMETER does not work? 在其中 Olafur Tryggvason 对“应用程序设置”进行了一些设置,但我无法找到配置。应该在“应用程序生成器”中,但不是。
在顶点
运行
select * from nls_session_parameters;
结果
PARAMETER VALUE
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT mm/dd/yyyy
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
运行
ALTER SESSION SET nls_date_format ="dd/mm/yyyy";
结果
Statement processed.
0.00 seconds
运行
select * from nls_session_parameters;
结果
PARAMETER VALUE
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT mm/dd/yyyy
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
在 SQL 开发人员中
运行
select * from nls_session_parameters;
结果
PARAMETER VALUE
NLS_LANGUAGE SPANISH
NLS_TERRITORY SPANISH
NLS_CURRENCY €
NLS_ISO_CURRENCY SPAIN
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT mm/dd/yyyy
NLS_DATE_LANGUAGE SPANISH
NLS_SORT SPANISH
NLS_TIME_FORMAT HH24.MI.SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY €
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
运行
ALTER SESSION SET nls_date_format ="dd/mm/yyyy";
结果
1 fila insertadas.
Session alterado.
运行
select * from nls_session_parameters;
结果
PARAMETER VALUE
NLS_LANGUAGE SPANISH
NLS_TERRITORY SPANISH
NLS_CURRENCY €
NLS_ISO_CURRENCY SPAIN
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT dd/mm/yyyy
NLS_DATE_LANGUAGE SPANISH
NLS_SORT SPANISH
NLS_TIME_FORMAT HH24.MI.SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY €
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
【问题讨论】:
【参考方案1】:方法如下(如果我理解正确的话):
登录 Apex 转到应用生成器 选择应用程序 您会在右上角看到编辑应用程序属性按钮 它包含 4 个选项卡(定义、安全、全球化、用户界面) 转到安全 向下滚动到“数据库会话”在“初始化 PL/SQL 代码”中加入这样的内容:
begin
execute immediate q'[alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss']';
end;
应用更改
应该可以的。
初始化代码也可以包含其他设置,例如NLS_NUMERIC_CHARACTERS
:
execute immediate q'[alter session set nls_numeric_characters = ', ']';
如有必要,请考虑恢复这些更改 - 请参阅同一安全页面上“初始化代码”下方的“清理 PL/SQL 代码”部分。
【讨论】:
你也可以运行execute immediate
而不是DBMS_SESSION.SET_NLS('nls_date_format', 'dd.mm.yyyy hh24:mi:ss');
【参考方案2】:
Oracle APEX 使用共享连接池来执行查询。如果你在 SQL Workshop 中运行它,我认为你不会得到你期望的结果。
如果您将此作为任何给定事务的一部分运行,或者如果它出现在 Littfoot 建议的初始化代码中,您应该会看到该会话的格式更改。一旦控制权在浏览器中返回给用户,数据库连接就会被释放。
这与您不能在 Oracle APEX 中使用包持久变量和全局临时表等概念的原因相同。
如果您需要更改应用程序的设置,推荐的地方是共享组件中的 Globalization Attributes。 (应用程序属性中的第三个选项卡。)
【讨论】:
以上是关于ALTER SESSION SET nls_date_format 在 APEX 中不起作用。但是在 SQL Developer 中工作的主要内容,如果未能解决你的问题,请参考以下文章
ALTER SESSION SET nls_date_format 在 APEX 中不起作用。但是在 SQL Developer 中工作
alter database和alter system和alter session的区别
尝试运行 alter session 命令以通过 JDBC 设置会话变量
找出 alter system kill session ‘sid,serial#’ kill 掉的数据库会话对应进程
oracle Alter Session NLS FORMAT for bulk insert statements - 行为不符合预期