DBMS_SESSION包小議(二)

yangtingkun發表於2010-03-19

除了使用ALTER SESSION設定會話的狀態,利用V$SESSION查詢會話狀態,Oracle還提供了PL/SQL介面DBMS_SESSION來查詢和設定會話相關的狀態。

描述SET_NLS過程。

DBMS_SESSION包小議(一):http://yangtingkun.itpub.net/post/468/498365

 

 

一般來說設定會話級的狀態都是透過ALTER SESSION語句,也有個別的例外,比如角色的設定是透過SET語句實現的。Oracle除了提供SQL的方法外,還提供了PL/SQL的介面,DBMS_SESSION包,將會話狀態的設定和查詢整合在這個包中。

簡單介紹一下SET_NLS過程,使用這個過程可以設定會話級的NLS引數設定:

SQL> SELECT * FROM V$NLS_PARAMETERS;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   SIMPLIFIED CHINESE
NLS_TERRITORY                  CHINA
NLS_CURRENCY                  

NLS_ISO_CURRENCY               CHINA
NLS_NUMERIC_CHARACTERS         .,
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              SIMPLIFIED CHINESE
NLS_CHARACTERSET               ZHS16GBK
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY             

NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE

已選擇19行。

下面利用SET_NLS過程修改NLS_DATE_FORMAT變數:

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
--------------
20-3
-10

SQL> EXEC DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT', 'YYYY-MM-DD HH24:MI:SS')
BEGIN DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT', 'YYYY-MM-DD HH24:MI:SS'); END;

*
1 行出現錯誤:
ORA-00922:
選項缺失或無效
ORA-06512:
"SYS.DBMS_SESSION", line 164
ORA-06512:
line 1

SQL> EXEC DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT', '''YYYY-MM-DD HH24:MI:SS''')

PL/SQL 過程已成功完成。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-03-20 01:44:22

需要注意,SET_NLS的第二個引數VALUE輸入的值除了需要的格式外,還需要包含引號,否則會引發錯誤

其他的會話級NLS引數也可以修改:

SQL> SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;

TO_CHAR(S
---------
星期六

SQL> EXEC DBMS_SESSION.SET_NLS('NLS_DATE_LANGUAGE', '''ENGLISH''')

PL/SQL 過程已成功完成。

SQL> SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;

TO_CHAR(SYSDA
-------------
SATURDAY

SQL> EXEC DBMS_SESSION.SET_NLS('NLS_LANGUAGE', '''AMERICAN''')

PL/SQL procedure successfully completed.

SQL> SELECT SYSTIMESTAMP FROM DUAL;

SYSTIMESTAMP
---------------------------------------------------------------------------
20-MAR-10 01.59.26.075978 AM +08:00

SQL> EXEC DBMS_SESSION.SET_NLS('NLS_TIMESTAMP_TZ_FORMAT', '''SYYYY-MM-DD HH24:MI:SS.FF TZR''')

PL/SQL procedure successfully completed.

SQL> SELECT SYSTIMESTAMP FROM DUAL;

SYSTIMESTAMP
---------------------------------------------------------------------------
 2010-03-20 02:00:27.000487 +08:00

再次查詢V$NLS_PARAMETERS檢視,檢查修改後的引數設定:

SQL> SELECT * FROM V$NLS_PARAMETERS;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  CHINA
NLS_CURRENCY                  

NLS_ISO_CURRENCY               CHINA
NLS_NUMERIC_CHARACTERS         .,
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                YYYY-MM-DD HH24:MI:SS
NLS_DATE_LANGUAGE              AMERICAN
NLS_CHARACTERSET               ZHS16GBK
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        SYYYY-MM-DD HH24:MI:SS.FF TZR
NLS_DUAL_CURRENCY             

NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE

19 rows selected.

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-629969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章