oracle中如何跨不同session支持可读写的全局变量

      oracle9i以上通过GLOBALLY ACCESSED CONTEXT方式可以实现。但在11GR2之前,这个特性不能在RAC环境下使用,让我们稍微感到一些遗憾.

      首先,用户必须有CREATE ANY CONTEXT权限.

      为了隔离访问,我以包的方式说明如何声明/修改/获取全局变量.

 

 ---- 创建CONTEXT并和一个包绑定:
Create or Replace Context AppContext using BasePkg ACCESSED GLOBALLY

---- 创建一个包来写入变量:
create or replace package BasePkg
as
   procedure SetAppContext( name       in varchar2,value      in varchar2 );

   procedure init;
end BasePkg;
----包体内容

create or replace package body BasePkg

as

   G_SESSION_ID  Constant Number := -1;
    

procedure init
    IS
    begin

       NULL;
     end;

 

    procedure SetAppContext( name       in varchar2,value      in varchar2 )

    as
    begin
            dbms_session.setAppContext ( 'FMIS_BASE', name, value, NULL, G_SESSION_ID );
    end;
begin
     dbms_session.set_identifier( g_session_id );  
end BasePkg ;
--- 每次初始化以后

EXEC BasePkg .init;

--就可以跨session,访问全局变量了

select sys_context( 'FMIS_BASE' ,'变量名' )  from dual

 

Oracle 数据库,可以使用包(package)或者会话(session)级别的上下文(context)来定义全局变量。 1. 使用包(package)定义全局变量: 首先,在包声明一个变量,并将其设置为公共(public)的,这样其他包或过程可以访问它。然后,可以在包的任何过程或函数使用该变量。 以下是一个示例代码: ```sql CREATE OR REPLACE PACKAGE my_package IS -- 声明一个全局变量 g_variable NUMBER; END my_package; / CREATE OR REPLACE PACKAGE BODY my_package IS -- 初始化全局变量 PROCEDURE init_variable IS BEGIN g_variable := 10; END init_variable; -- 使用全局变量 PROCEDURE use_variable IS BEGIN DBMS_OUTPUT.PUT_LINE(g_variable); END use_variable; END my_package; ``` 在上述示例,"my_package" 包声明了一个名为 "g_variable" 的全局变量,并在 "init_variable" 过程初始化为 10。在 "use_variable" 过程,可以访问并使用该全局变量。 2. 使用会话(session)级别的上下文(context)定义全局变量Oracle 还提供了一种使用会话级别的上下文(context)来定义全局变量的方式。这种方式允许在会话内共享和访问全局变量,但对于其他会话来说是隔离的。 以下是一个示例代码: ```sql -- 创建上下文(context) CREATE OR REPLACE CONTEXT my_context USING my_package; -- 设置全局变量的值 EXECUTE IMMEDIATE 'BEGIN DBMS_SESSION.SET_CONTEXT(''my_context'', ''g_variable'', 10); END;'; -- 在过程使用全局变量 CREATE OR REPLACE PROCEDURE use_variable IS v_variable NUMBER; BEGIN v_variable := SYS_CONTEXT('my_context', 'g_variable'); DBMS_OUTPUT.PUT_LINE(v_variable); END use_variable; ``` 在上述示例,首先创建了一个名为 "my_context" 的上下文,其使用了之前创建的包 "my_package"。然后,通过使用 `DBMS_SESSION.SET_CONTEXT` 过程,将全局变量 "g_variable" 的值设置为 10。最后,在过程 "use_variable" 使用 `SYS_CONTEXT` 函数来获取并使用该全局变量的值。 这些是在 Oracle 数据库定义全局变量的两种常见方法。根据具体的需求和场景选择适合的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值