VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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的示例

相关链接

CREATE CONTEXT