DBMS_SESSION包小議(八)
除了使用ALTER SESSION設定會話的狀態,利用V$SESSION查詢會話狀態,Oracle還提供了PL/SQL介面DBMS_SESSION來查詢和設定會話相關的狀態。
描述CONTEXT相關的過程。
DBMS_SESSION包小議(一):http://yangtingkun.itpub.net/post/468/498365
DBMS_SESSION包小議(二):http://yangtingkun.itpub.net/post/468/498408
DBMS_SESSION包小議(三):http://yangtingkun.itpub.net/post/468/498451
DBMS_SESSION包小議(四):http://yangtingkun.itpub.net/post/468/498475
DBMS_SESSION包小議(五):http://yangtingkun.itpub.net/post/468/498559
DBMS_SESSION包小議(六):http://yangtingkun.itpub.net/post/468/498666
DBMS_SESSION包小議(七):http://yangtingkun.itpub.net/post/468/498676
一般來說設定會話級的狀態都是透過ALTER SESSION語句,也有個別的例外,比如角色的設定是透過SET語句實現的。Oracle除了提供SQL的方法外,還提供了PL/SQL的介面,DBMS_SESSION包,將會話狀態的設定和查詢整合在這個包中。
會話可以設定上下文資訊,比如在VDB中,就會利用上下文來獲取必要的資訊。
SQL> CREATE OR REPLACE CONTEXT MY_CONTEXT USING P_TEST;
上下文已建立。
SQL> CREATE OR REPLACE PACKAGE P_TEST AS
2 PROCEDURE P_SET;
3 END;
4 /
程式包已建立。
SQL> CREATE OR REPLACE PACKAGE BODY P_TEST AS
2
3 PROCEDURE P_SET AS
4 BEGIN
5 DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR1', '10');
6 DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR2', '50');
7 DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR3', '100');
8 END;
9 END;
10 /
程式包體已建立。
SQL> EXEC P_TEST.P_SET
PL/SQL 過程已成功完成。
下面透過LIST_CONTEXT過程檢查上下文設定結果:
SQL> SET SERVEROUT ON SIZE 100000
SQL> DECLARE
2 V_LIST DBMS_SESSION.APPCTXTABTYP;
3 V_NUM NUMBER;
4 BEGIN
5 DBMS_SESSION.LIST_CONTEXT(V_LIST, V_NUM);
6 FOR I IN 1..V_NUM LOOP
7 DBMS_OUTPUT.PUT_LINE('NAMESPACE:' || V_LIST(I).NAMESPACE
8 || ', ATTRIBUTE:' || V_LIST(I).ATTRIBUTE
9 || ', VALUE:' || V_LIST(I).VALUE);
10 END LOOP;
11 END;
12 /
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR3, VALUE:100
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR2, VALUE:50
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR1, VALUE:10
PL/SQL 過程已成功完成。
利用CLEAR_CONTEXT清除上下文設定:
SQL> CREATE OR REPLACE PACKAGE P_TEST AS
2 PROCEDURE P_SET;
3 PROCEDURE P_CLEAR;
4 PROCEDURE P_CLEAR_ALL;
5 END;
6 /
程式包已建立。
SQL> CREATE OR REPLACE PACKAGE BODY P_TEST AS
2
3 PROCEDURE P_SET AS
4 BEGIN
5 DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR1', '10');
6 DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR2', '50');
7 DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'ATTR3', '100');
8 END;
9
10 PROCEDURE P_CLEAR AS
11 BEGIN
12 DBMS_SESSION.CLEAR_CONTEXT('MY_CONTEXT', NULL, 'ATTR2');
13 END;
14
15 PROCEDURE P_CLEAR_ALL AS
16 BEGIN
17 DBMS_SESSION.CLEAR_ALL_CONTEXT('MY_CONTEXT');
18 END;
19 END;
20 /
程式包體已建立。
SQL> EXEC P_TEST.P_CLEAR
PL/SQL 過程已成功完成。
SQL> DECLARE
2 V_LIST DBMS_SESSION.APPCTXTABTYP;
3 V_NUM NUMBER;
4 BEGIN
5 DBMS_SESSION.LIST_CONTEXT(V_LIST, V_NUM);
6 FOR I IN 1..V_NUM LOOP
7 DBMS_OUTPUT.PUT_LINE('NAMESPACE:' || V_LIST(I).NAMESPACE
8 || ', ATTRIBUTE:' || V_LIST(I).ATTRIBUTE
9 || ', VALUE:' || V_LIST(I).VALUE);
10 END LOOP;
11 END;
12 /
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR3, VALUE:100
NAMESPACE:MY_CONTEXT, ATTRIBUTE:ATTR1, VALUE:10
PL/SQL 過程已成功完成。
SQL> EXEC P_TEST.P_CLEAR_ALL
PL/SQL 過程已成功完成。
SQL> DECLARE
2 V_LIST DBMS_SESSION.APPCTXTABTYP;
3 V_NUM NUMBER;
4 BEGIN
5 DBMS_SESSION.LIST_CONTEXT(V_LIST, V_NUM);
6 FOR I IN 1..V_NUM LOOP
7 DBMS_OUTPUT.PUT_LINE('NAMESPACE:' || V_LIST(I).NAMESPACE
8 || ', ATTRIBUTE:' || V_LIST(I).ATTRIBUTE
9 || ', VALUE:' || V_LIST(I).VALUE);
10 END LOOP;
11 END;
12 /
PL/SQL 過程已成功完成。
需要注意,在建立上下文的時候指定了PACKAGE,此後設定上下文或清除上下文設定都需要透過這個包的過程來完成,如果直接嘗試呼叫SET_CONTEXT或CLEAR_CONTEXT則會報錯許可權不足:
SQL> EXEC DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'A', '50')
BEGIN DBMS_SESSION.SET_CONTEXT('MY_CONTEXT', 'A', '50'); END;
*
第 1 行出現錯誤:
ORA-01031: 許可權不足
ORA-06512: 在 "SYS.DBMS_SESSION", line 101
ORA-06512: 在 line 1
SQL> EXEC DBMS_SESSION.CLEAR_CONTEXT('MY_CONTEXT', NULL, 'ATTR2')
BEGIN DBMS_SESSION.CLEAR_CONTEXT('MY_CONTEXT', NULL, 'ATTR2'); END;
*
第 1 行出現錯誤:
ORA-01031: 許可權不足
ORA-06512: 在 "SYS.DBMS_SESSION", line 115
ORA-06512: 在 line 1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-630724/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DBMS_SESSION包小議(七)Session
- DBMS_SESSION包小議(六)Session
- DBMS_SESSION包小議(五)Session
- DBMS_SESSION包小議(四)Session
- DBMS_SESSION包小議(三)Session
- DBMS_SESSION包小議(二)Session
- DBMS_SESSION包小議(一)Session
- tshark 抓包 mysql 協議包MySql協議
- oracle dbms包和其他包的使用大全 (八)Oracle
- WireShark——IP協議包分析(Ping分析IP協議包)協議
- rust學習八、包和模組Rust
- 高效會議的“八項原則”
- 草根學Python(八) 模組與包Python
- 小議解析parse
- oracle nomount小議Oracle
- HTTP協議資料包HTTP協議
- 03:八進位制小數
- Dubbo原始碼學習--Rmi協議(八)原始碼協議
- 深入理解javascript系列(八):閉包(2)JavaScript
- TCP協議小結TCP協議
- Javascript 閉包小結JavaScript
- UDP協議抓包分析 -- wiresharkUDP協議
- [正兒八經PHP]PHP閉包(Closure)初探PHP
- 小知識二、Then協議協議
- 資料庫安全小議資料庫
- 小議“資料開放”
- 小議星型轉換
- 小議軟體測試
- Http網路協議包 (快速理解)HTTP協議
- 使用WireShark抓包分析TCP協議TCP協議
- Wireshark中的TCP協議包分析TCP協議
- python閉包小例子Python
- 微信小程式抓包-windows微信小程式Windows
- 智慧小程式檔案館——小程式包更新
- 如何減小微信小程式程式碼包大小微信小程式
- Wireshark資料抓包分析(網路協議篇)第1章網路協議抓包概述協議
- beego orm 時間相差八小時GoORM
- 簡化 Django 開發的八個 Python 包DjangoPython