Stored procedures 在oracle 11g中,在何处更改NLS_日期_格式?

Stored procedures 在oracle 11g中,在何处更改NLS_日期_格式?,stored-procedures,plsql,oracle11g,Stored Procedures,Plsql,Oracle11g,我需要更改存储过程中的NLS_DATE_格式。它似乎是一个会话变量,我应该在哪里更改变量掩码 应该在全局声明中还是在其他地方(我的意思是从前端)执行此操作。如果要更改过程中的NLS参数,则可以使用。给定一个如下所示的环境: SQL> select value 2 from nls_session_parameters 3 where parameter = 'NLS_DATE_FORMAT'; VALUE --------------------------------

我需要更改存储过程中的NLS_DATE_格式。它似乎是一个会话变量,我应该在哪里更改变量掩码


应该在全局声明中还是在其他地方(我的意思是从前端)执行此操作。

如果要更改过程中的NLS参数,则可以使用。给定一个如下所示的环境:

SQL> select value
  2    from nls_session_parameters
  3   where parameter = 'NLS_DATE_FORMAT';

VALUE
------------------------------------------

DD-MON-RR

SQL> select sysdate from dual;

SYSDATE
---------
25-NOV-14
执行该过程会更改格式(请注意三个单引号):

或者,您可以使用动态SQL,例如:

SQL> begin
  2     execute immediate 'alter session set nls_date_format = ''yyyy-mm''';
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select sysdate from dual;

SYSDATE
-------
2014-11

但是,因为这是非常不寻常的。如果要在数据类型之间转换,则应始终使用显式格式显式转换。对于日期,正确使用的函数是

alter session set nls_date_format='…'
,但是,如何为包执行此操作?只需使用
execute immediate
运行SQL为什么要更改存储过程中的
nls_date_format
?如果您的代码需要特定格式的字符串(或将特定格式的字符串转换为日期),则应使用带有显式格式掩码的显式强制转换,在这种情况下,
NLS\u DATE\u格式
。如果您的代码正在进行基于
NLS\u DATE\u格式的转换
,它不应该关心格式是什么,只需要特定用户要求使用特定格式的数据即可。
SQL> begin
  2     execute immediate 'alter session set nls_date_format = ''yyyy-mm''';
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select sysdate from dual;

SYSDATE
-------
2014-11