oracle上下文 查看删除,【Oracle】自定义CONTEXT(上下文)

Default

SCOTT@ORA11GR2> select sys_context('userenv','db_name') db_name,sys_context('userenv','host') host_name from dual;

DB_NAME  HOST_NAME

-------- ----------

ORA11GR2 ocmu

SCOTT@ORA11GR2>

1

2

3

4

5

6

7

SCOTT@ORA11GR2>selectsys_context('userenv','db_name')db_name,sys_context('userenv','host')host_namefromdual;

DB_NAME HOST_NAME

------------------

ORA11GR2ocmu

SCOTT@ORA11GR2>

如果需要返回一些属于我们自己的上下文,当然,我们可以自己来定义。

一、设置上下文

Default

DBMS_SESSION.SET_CONTEXT (

namespace VARCHAR2,

attribute VARCHAR2,

value VARCHAR2,

username VARCHAR2,

client_id VARCHAR2 );

参数含义:

namespace:上下文的名称

attribute:上下文的属性

value:上下文的值

username:应用程序上下文属性数据库的用户名,默认值为null

client_id:特定于应用程序的client_id,默认值为null

特别注意:DBMS_SESSION.SET_CONTEXT这个过程必须使用包或者过程等来调用,不能直接exec的方式手工执行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

DBMS_SESSION.SET_CONTEXT(

namespaceVARCHAR2,

attributeVARCHAR2,

valueVARCHAR2,

usernameVARCHAR2,

client_idVARCHAR2);

参数含义:

namespace:上下文的名称

attribute:上下文的属性

value:上下文的值

username:应用程序上下文属性数据库的用户名,默认值为null

client_id:特定于应用程序的client_id,默认值为null

特别注意:DBMS_SESSION.SET_CONTEXT这个过程必须使用包或者过程等来调用,不能直接exec的方式手工执行。

二、创建上下文语法

Default

CREATE [ OR REPLACE ] CONTEXT namespace

USING [ schema. ] package

[ INITIALIZED { EXTERNALLY | GLOBALLY }| ACCESSED GLOBALLY] ;

INITIALIZED子句:指定实体意外的其他数据库

ACCESSED GLOBALLY:当前实例任何应用程序都可以访问上下文,多个会话可以共享上下文的属性。

1

2

3

4

5

6

CREATE[ORREPLACE]CONTEXTnamespace

USING[schema.]package

[INITIALIZED{EXTERNALLY|GLOBALLY}|ACCESSEDGLOBALLY];

INITIALIZED子句:指定实体意外的其他数据库

ACCESSEDGLOBALLY:当前实例任何应用程序都可以访问上下文,多个会话可以共享上下文的属性。

三、自定义上下文测试

1):创建一个简单的过程,过程的功能为初始化自定义上下文,以字符串形式返回系统时间的年月日

Default

SYSTEM@ORA11GR2> CREATE OR REPLACE PROCEDURE sp_context IS

BEGIN

dbms_session.set_context('MY_CONTEXT', 'XXF', to_char(sysdate,'yyyymmdd'));

END;

/

Procedure created.

SYSTEM@ORA11GR2>

1

2

3

4

5

6

7

8

9

SYSTEM@ORA11GR2>CREATEORREPLACEPROCEDUREsp_contextIS

BEGIN

dbms_session.set_context('MY_CONTEXT','XXF',to_char(sysdate,'yyyymmdd'));

END;

/

Procedurecreated.

SYSTEM@ORA11GR2>

2):创建自定义上下文my_context,利用刚刚创建好的过程

Default

SYSTEM@ORA11GR2> create or replace context my_context using sp_context;

Context created.

SYSTEM@ORA11GR2>

1

2

3

4

5

SYSTEM@ORA11GR2>createorreplacecontextmy_contextusingsp_context;

Contextcreated.

SYSTEM@ORA11GR2>

3):验证自定义上下文my_context,结果返回为null,原因是,我们没有初始化’XXF’属性

Default

SYSTEM@ORA11GR2> select sys_context('MY_CONTEXT', 'XXF') from dual;

SYS_CONTEXT('MY_CONTEXT','XXF')

------------------------------------------------------------------

SYSTEM@ORA11GR2>

1

2

3

4

5

6

7

SYSTEM@ORA11GR2>selectsys_context('MY_CONTEXT','XXF')fromdual;

SYS_CONTEXT('MY_CONTEXT','XXF')

------------------------------------------------------------------

SYSTEM@ORA11GR2>

4):手工执行一下过程sp_context

Default

SYSTEM@ORA11GR2> exec sp_context

PL/SQL procedure successfully completed.

SYSTEM@ORA11GR2>

1

2

3

4

5

SYSTEM@ORA11GR2>execsp_context

PL/SQLproceduresuccessfullycompleted.

SYSTEM@ORA11GR2>

5):再次验证自定义上下文sys_context,返回了我们想要的结果,此时有朋友会问,这也太麻烦了,每次都需要手工执行一下过程,其实这个问题很好解决,我们可以通过触发器来解决此问题。

Default

SYSTEM@ORA11GR2> select sys_context('MY_CONTEXT', 'XXF') from dual;

SYS_CONTEXT('MY_CONTEXT','XXF')

------------------------------------------------------------------

20121129

SYSTEM@ORA11GR2>

1

2

3

4

5

6

7

SYSTEM@ORA11GR2>selectsys_context('MY_CONTEXT','XXF')fromdual;

SYS_CONTEXT('MY_CONTEXT','XXF')

------------------------------------------------------------------

20121129

SYSTEM@ORA11GR2>

6):创建一个数据库级触发器,每次登陆后都触发过程sp_context

Default

SYSTEM@ORA11GR2> create or replace trigger trg_context

after logon on database

begin

sp_context;

end;

/

Trigger created.

SYSTEM@ORA11GR2> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

[oracle@ocmu ~]$

1

2

3

4

5

6

7

8

9

10

11

12

13

SYSTEM@ORA11GR2>createorreplacetriggertrg_context

afterlogonondatabase

begin

sp_context;

end;

/

Triggercreated.

SYSTEM@ORA11GR2>exit

DisconnectedfromOracleDatabase11gEnterpriseEditionRelease11.2.0.1.0-Production

WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions

[oracle@ocmu~]$

7):重新登陆一个新的会话,验证自定义上下文,成功。

Default

[oracle@ocmu ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Thu Nov 29 21:26:59 2012

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SCOTT@ORA11GR2> select sys_context('MY_CONTEXT', 'XXF') from dual;

SYS_CONTEXT('MY_CONTEXT','XXF')

-----------------------------------------------------------------

20121129

SCOTT@ORA11GR2>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

[oracle@ocmu~]$sqlplusscott/tiger

SQL*Plus:Release11.2.0.1.0ProductiononThuNov2921:26:592012

Copyright(c)1982,2009,Oracle.Allrightsreserved.

Connectedto:

OracleDatabase11gEnterpriseEditionRelease11.2.0.1.0-Production

WiththePartitioning,OLAP,DataMiningandRealApplicationTestingoptions

SCOTT@ORA11GR2>selectsys_context('MY_CONTEXT','XXF')fromdual;

SYS_CONTEXT('MY_CONTEXT','XXF')

-----------------------------------------------------------------

20121129

SCOTT@ORA11GR2>

四、小结:

1)创建上下文,默认情况下是ACCESSED GLOBALLY,SCOTT用户都可以直接使用。

2)本例只是一个简单的测试,如果有复杂的需求,那么可以在过程中完成复杂的逻辑来实现需求。

3)创建上下文需要有CREATE ANY CONTEXT的系统权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值