NLS 参数中跟数据库字符集有关的参数 NLS_CHARACTER 和 NLS_NCHAR_CHARACTER 在租户创建好后就不能修改,目前仅支持修改跟时间和日期格式相关的 NLS 参数。

修改 NLS 参数分为修改数据库级别的 NLS 参数和修改会话级别的 NLS 参数,前者需要租户的管理员权限用户(默认用户 sys)才可以。

修改数据库级别的 NLS 参数

修改一个数据库级别的 NLS 参数通常是在所属的 Oracle 租户内部,有两种方法:

  • 通过 ALTER SYSTEM SET 命令修改数据库级别 NLS 参数。
  • 通过 SET GLOBAL 命令修改数据库级别 NLS 参数。

示例:修改数据库级别的 NLS 参数

  1. obclient> select * from nls_database_parameters where parameter in ('NLS_DATE_FORMAT','NLS_TIMESTAMP_FORMAT','NLS_TIMESTAMP_TZ_FORMAT');
  2. +-------------------------+------------------------------+
  3. | PARAMETER | VALUE |
  4. +-------------------------+------------------------------+
  5. | NLS_DATE_FORMAT | DD-MON-RR |
  6. | NLS_TIMESTAMP_FORMAT | DD-MON-RR HH.MI.SSXFF AM |
  7. | NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
  8. +-------------------------+------------------------------+
  9. 3 rows in set (0.00 sec)
  10. obclient> alter system set nls_date_format='YYYY-MM-DD';
  11. Query OK, 0 rows affected (0.01 sec)
  12. obclient> set global nls_timestamp_format='YYYY-MM-DD HH24:MI:SSXFF';
  13. Query OK, 0 rows affected (0.01 sec)
  14. obclient> set global nls_timestamp_tz_format='YYYY-MM-DD HH24:MI:SSXFF';
  15. Query OK, 0 rows affected (0.01 sec)
  16. obclient> select * from nls_database_parameters where parameter in ('NLS_DATE_FORMAT','NLS_TIMESTAMP_FORMAT','NLS_TIMESTAMP_TZ_FORMAT');
  17. +-------------------------+--------------------------+
  18. | PARAMETER | VALUE |
  19. +-------------------------+--------------------------+
  20. | NLS_DATE_FORMAT | YYYY-MM-DD |
  21. | NLS_TIMESTAMP_FORMAT | YYYY-MM-DD HH24:MI:SSXFF |
  22. | NLS_TIMESTAMP_TZ_FORMAT | YYYY-MM-DD HH24:MI:SSXFF |
  23. +-------------------------+--------------------------+
  24. 3 rows in set (0.00 sec)
  25. obclient> select * from nls_session_parameters where parameter in ('NLS_DATE_FORMAT','NLS_TIMESTAMP_FORMAT','NLS_TIMESTAMP_TZ_FORMAT');
  26. +-------------------------+------------------------------+
  27. | PARAMETER | VALUE |
  28. +-------------------------+------------------------------+
  29. | NLS_DATE_FORMAT | DD-MON-RR |
  30. | NLS_TIMESTAMP_FORMAT | DD-MON-RR HH.MI.SSXFF AM |
  31. | NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
  32. +-------------------------+------------------------------+
  33. 3 rows in set (0.00 sec)

从上面示例可以看出,修改数据库级别的 NLS 参数并不会应用于当前会话,需要断开会话重新连接才会生效。

  1. obclient> select sysdate, systimestamp from dual;
  2. +-----------+-------------------------------------+
  3. | SYSDATE | SYSTIMESTAMP |
  4. +-----------+-------------------------------------+
  5. | 02-APR-20 | 02-APR-20 07.50.58.427570 PM +08:00 |
  6. +-----------+-------------------------------------+
  7. 1 row in set (0.00 sec)
  8. obclient> show session variables where variable_name in ('nls_date_format','nls_timestamp_format','nls_timestamp_tz_format');
  9. +-------------------------+------------------------------+
  10. | VARIABLE_NAME | VALUE |
  11. +-------------------------+------------------------------+
  12. | nls_date_format | DD-MON-RR |
  13. | nls_timestamp_format | DD-MON-RR HH.MI.SSXFF AM |
  14. | nls_timestamp_tz_format | DD-MON-RR HH.MI.SSXFF AM TZR |
  15. +-------------------------+------------------------------+
  16. 3 rows in set (0.01 sec)
  17. obclient>

修改会话级别的 NLS 参数

客户端会话可以设置跟数据库不同的 NLS 参数,当时只支持对日期和时间格式的 NLS 参数进行修改。

会话级别的 NLS 参数有两种修改方法:

  • 通过 ALTER SESSION SET 命令修改
  • 通过 SET [SESSION] VARIABLE 命令修改

示例:修改会话级别的 NLS 参数

  1. obclient> alter session set nls_date_format='YYYY/MM/DD';
  2. Query OK, 0 rows affected (0.00 sec)
  3. obclient> set session nls_timestamp_format='YYYY/MM/DD HH.MI.SSXFF AM';
  4. Query OK, 0 rows affected (0.00 sec)
  5. obclient> set session nls_timestamp_tz_format='YYYY/MM/DD HH.MI.SSXFF AM TZR';
  6. Query OK, 0 rows affected (0.00 sec)
  7. obclient> select sysdate, systimestamp from dual;
  8. +------------+--------------------------------------+
  9. | SYSDATE | SYSTIMESTAMP |
  10. +------------+--------------------------------------+
  11. | 2020/04/02 | 2020/04/02 07.51.52.254705 PM +08:00 |
  12. +------------+--------------------------------------+
  13. 1 row in set (0.00 sec)
  14. obclient> show variables where variable_name in ('nls_date_format','nls_timestamp_format','nls_timestamp_tz_format');
  15. +-------------------------+-------------------------------+
  16. | VARIABLE_NAME | VALUE |
  17. +-------------------------+-------------------------------+
  18. | nls_date_format | YYYY/MM/DD |
  19. | nls_timestamp_format | YYYY/MM/DD HH.MI.SSXFF AM |
  20. | nls_timestamp_tz_format | YYYY/MM/DD HH.MI.SSXFF AM TZR |
  21. +-------------------------+-------------------------------+
  22. 3 rows in set (0.01 sec)
  23. obclient>

会话级别的 NLS 参数修改作用范围是当前会话,如果会话断开再重连,又会获取数据库级别的 NLS 参数作为会话参数的初始值。