DBMS_SESSION
功能描述
Vastbase G100在Oracle兼容模式下支持内置包DBMS_SESSION的部分功能,该内置包提供了查询和设置会话相关状态的方法。
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
使用CREATE CONTEXT创建的context默认当前用户可使用,支持用户调用ACCESSED GLOBALLY设置context为全局变量。此时其他用户可以查询该命名空间下的attribute。
子程序
Vastbase支持该内置包的如下函数:
函数 | 描述 |
---|---|
modify_package_state | 用于重置当前会话中所有package的状态,重新初始化包。 |
set_context | 在用户自定义的命名空间下设置attribute-value值。输出类型为void。 注意:函数只能在通过create context创建的namespace下创建attribute-value,其值保存在内存中。 |
clear_all_context | 用于清除当前命名空间即命名空间中的所有attribute-value值。该过程需通过 namespace关联的 package 调用。输出类型为void。 |
modify_package_state
语法格式
function modify_package_state(
flag in TINYINT --1or2
) return bool;
参数说明
- flag in
用户指定的入参,类型为TINYINT。当入参为1,2时函数返回为true代表调用成功,其他情况下返回false。
注意事项
flag in传入内核中区分不同的逻辑处理,为2时性能更优。
示例
1、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。
set serveroutput =on;
2、创建包含全局变量v_stack_depth的pkg1。
create or replace package pkg1 is
v_stack_depth number;
function get_stack_depth return number;
end;
/
3、在包体初始化中对全局变量赋值,并打印初始化信息。
create or replace package body pkg1 is
function get_stack_depth return number
is
begin
v_stack_depth := v_stack_depth + 1;
return v_stack_depth;
end;
begin
v_stack_depth := 0;
dbms_output.put_line('初始化pkg1');
end;
/
4、连续调用包中函数,函数返回全局变量v_stack_depth的值。
select pkg1.get_stack_depth from dual;
select pkg1.get_stack_depth from dual;
返回结果依次为:
初始化pkg1
get_stack_depth
-----------------
1
(1 row)
get_stack_depth
-----------------
2
(1 row)
5、重置会话中所有package的初始化值。
call dbms_session.modify_package_state(2);
返回结果为:
modify_package_state
----------------------
t
(1 row)
6、检测是否重新初始化。(连续调用包中函数返回v_stack_depth的值。)
select pkg1.get_stack_depth from dual;
select pkg1.get_stack_depth from dual;
返回结果依次为:
初始化pkg1
get_stack_depth
-----------------
1
(1 row)
get_stack_depth
-----------------
2
(1 row)
成功使用内置包函数DBMS_SESSION.modify_package_state重置函数入参为1。
set_context
语法格式
DBMS_SESSION.SET_CONTEXT (
NAMESPACE VARCHAR2,
ATTRIBUTE VARCHAR2,
VALUE VARCHAR2,
USERNAME VARCHAR2,
CLIENT_ID VARCHAR2
);
参数说明
NAMESPACE
命名空间。
限制:不可为空,且长度不超过30。
ATTURIBUTE
命名空间下的的属性名。
限制:不可为空,且长度不超过30个字节。
VALUE
命名空间下的属性值。
限制:不可为空,且长度不超过128个字节。
USERNAME
用户名,默认值为NULL。
限制:当前本值为空,不支持指定。
CLIENT_ID
用户ID,默认值为NULL。
限制:当前本值为空,不支持指定。
DBMS_SESSION.set_context必须在函数、存储过程或package中调用,用户不能直接调用。
示例: 使用DBMS_SESSION包的内置函数实现上下文赋值和清除上下文属性值。
1、创建package,其中调用了set_context、clear_all_context函数,分别实现对上下文赋值和清除上下文属性值。
CREATE OR REPLACE PACKAGE pkg2 AS
PROCEDURE set_context(context_name IN VARCHAR2, attribute IN VARCHAR2, value IN VARCHAR2);
PROCEDURE clear_all_context(namespace IN VARCHAR2);
END pkg2;
/
CREATE OR REPLACE PACKAGE BODY pkg2 AS
PROCEDURE set_context(context_name IN VARCHAR2, attribute IN VARCHAR2, value IN VARCHAR2) IS
BEGIN
DBMS_SESSION.set_context(context_name, attribute, value);
END;
PROCEDURE clear_all_context(namespace IN VARCHAR2) IS
BEGIN
DBMS_SESSION.clear_all_context(namespace);
END;
END pkg2;
/
2、创建上下文。
CREATE CONTEXT test_namespace USING pkg2;
3、调用存储过程为上下文赋值,并查看上下文的属性。
CALL pkg2.set_context('test_namespace','attr1','val1');
SELECT SYS_CONTEXT('test_namespace','attr1') FROM DUAL;
返回结果显示为如下,成功调用set_context函数,则为上下文的赋属性值为val1
:
set_context
-------------
(1 row)
sys_context
-------------
val1
(1 row)
4、清除上下文,并查看上下文的属性。
call pkg2.clear_all_context('test_namespace');
SELECT SYS_CONTEXT('test_namespace','attr1') FROM DUAL;
返回结果如下,成功调用clear_all_context函数,则上下文被清除,查询结果为空:
clear_all_context
-------------------
(1 row)
ERROR: Inconsistent parameter: namespace 'TEST_NAMESPACE' dose not have parameter 'attr1'
CONTEXT: referenced column: sys_context
clear_all_context
语法格式
DBMS_SESSION.CLEAR_ALL_CONTEXT(
NAMESPACE VARCHAR2
);
参数说明
NAMESPACE:
命名空间。
限制:不可为空,且长度不超过30。
示例
参见DBMS_SESSION.set_context的示例。