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的区别

Oracle-Alter-Session

尝试运行 alter session 命令以通过 JDBC 设置会话变量

找出 alter system kill session ‘sid,serial#’ kill 掉的数据库会话对应进程

oracle Alter Session NLS FORMAT for bulk insert statements - 行为不符合预期