DBMS_SESSION
功能描述
Vastbase G100在Oracle兼容模式下支持内置包DBMS_SESSION的部分功能,该内置包提供了查询和设置会话相关状态的方法。
注意事项
该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。
使用CREATE CONTEXT创建的context默认当前用户可使用,支持用户调用ACCESSED GLOBALLY设置context为全局变量。此时其他用户可以查询该命名空间下的attribute。
子程序
Vastbase G100支持该内置包的如下函数:
函数 | 描述 |
---|---|
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
) return bool;
参数说明
flag in
用户指定的入参,类型为TINYINT。当入参为1,2时函数返回为true代表调用成功,其他情况下返回false。
flag in传入值区分不同的逻辑处理,为2时性能更优。
示例
前置步骤: 创建并切换至兼容模式为Oracle的数据库db_oracle。
CREATE DATABASE db_oracle dbcompatibility='A'; \c db_oracle
示例: modify_package_state函数的使用。
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;
返回结果依次为如下,表示成功使用内置包函数DBMS_SESSION.modify_package_state重置函数入参为1:
初始化pkg1 get_stack_depth ----------------- 1 (1 row) get_stack_depth ----------------- 2 (1 row)
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中调用,用户不能直接调用。
前置步骤: 创建并切换至兼容模式为Oracle的数据库db_oracle。
CREATE DATABASE db_oracle dbcompatibility='A'; \c db_oracle
示例: 使用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的示例。
相关链接