[转帖]Kingbase实现Oracle userenv函数功能

kingbase,实现,oracle,userenv,函数,功能 · 浏览次数 : 0

小编点评

**1. 问题** Kingbase如何实现Oracle的userenv函数功能? **2. 文档概述** 本文档主要通过调研Oracle的userenv函数功能,然后基于kingbase自定义函数形式实现userenv函数功能。 **3. Oracle userenv()函数功能调研** **3.1. 函数名称/函数原型** ```sql userenv('parameter') ``` **3.2. 函数功能** userenv函数的功能是返回有关当前会话的信息。例如返回语言名称的ISO缩写、当前数据库使用的语言和地区以及数据库字符集、当前会话ID等等。 **3.3. 参数介绍** **参数 1:parameter** * 表示要获取的有关当前会话的信息描述字符串。 * 示例:`userenv('sessionid')` **3.4. 函数示例** **示例 1:** ```sql select userenv('language') from dual; ``` **3.5. 基于Kingbase适配userenv函数功能的实现** **3.5.1. 实现userenv(‘parameter’);函数** ```sql create or replace function userenv(anynonarray) returns anynonarray as $$     declare     begin      case lower($1)      when 'sessionid' then      SELECT nextval('public.pg_session_id_sequence_oracle_comp') INTO res;     exception          WHEN sqlstate '55000' THEN      SELECT nextval('public.pg_session_id_sequence_oracle_comp') INTO res;     WHEN sqlstate '42P01' THEN      create sequence public.pg_session_id_sequence_oracle_comp;     SELECT nextval('public.pg_session_id_sequence_oracle_comp') INTO res;     end;     $$ language plpgsql strict SET client_min_messages to error; ``` **3.5.2. 使用select userenv('sessionid'::Text); & USERENV--------- 1(1 行记录) USERENV('ISDBA') 创建依赖函数** ```sql create OR REPLACE function get_isdba() returns boolean AS $$ select rolsuper from pg_roles where rolname=current_user; $$ language sql strict SET client_min_messages to error; **3.5.3. 使用select userenv('action'::Text); & USERENV--------- true(1 行记录) USERENV('ACTION') 创建依赖函数** ```sql create OR REPLACE function get_ACTION() returns text AS $$ select application_name from pg_stat_activity where pid=pg_backend_pid(); $$ language sql strict SET client_min_messages to error; **3.5.4. 使用select userenv('language'::text); & USERENV------------ en_US(1 行记录) USERENV('LANGUAGE') 创建依赖函数** ```sql create OR REPLACE function get_LANGUAGE() returns text AS $$ select (regexp_split_to_array(current_setting('lc_messages'), '\\.'))[1]; $$ language sql strict; **3.5.5. 使用select userenv('language'::text); & USERENV------------ en_US.UTF8(1 行记录) 文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树内置函数其它函数59737 人正在系统学习中

正文

目录

1. 问题

2. 文档概述

3. Oracle userenv()函数功能调研

3.1. 函数名称/函数原型

3.2. 函数功能

3.3. 参数介绍

3.3.1. Parameter

3.4. 函数示例

3.4.1. 示例1: 

3.5. 基于Kingbase适配userenv函数功能的实现

3.5.1. 实现userenv(‘parameter’);函数


1. 问题

Kingbase如何实现Oracle的userenv函数功能。

2. 文档概述

本文主要是通过调研Oracle的userenv函数功能,然后基于kingbase自定义函数形式实现userenv函数功能。

3. Oracle userenv()函数功能调研

3.1. 函数名称/函数原型

userenv(‘parameter’);

3.2. 函数功能

userenv函数的功能是返回有关当前会话的信息。例如返回语言名称的ISO缩写、当前数据库使用的语言和地区以及数据库字符集、当前会话ID等等

3.3. 参数介绍

3.3.1. Parameter

Parameter表示当前需要获取的有关当前会话的信息描述字符串。具体的如下表:

CLINET_INFO

返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_INFO包。

ENTRYID

返回当前审计条目编号。审计的EntryID序列细粒度的审计记录和定期审计记录之间共享。在分布式SQL语句不能使用这个属性。

ISDBA

如果用户已经被认证为dba;或者是通过操作系统或口令文件具有DBA特权的,返回“TRUE",否则返回"FALSE"。

LANG

返回ISO缩写语言名称,一个比现有的“语言”参数较短的形式。

LANGUAGE

返回数据库当前会话的语言、地域和字符集。

SESSIONID

返回审计会话标识符。在分布式SQL语句不能指定此参数。

SID

返回数据库会话ID。

TERMINAL

返回当前会话的终端操作系统的标识符。在分布式SQL语句,此参数返回了标识符为本地会话。在分布式环境中,此参数只支持远程SELECT语句,不用于远程INSERT,UPDATE或DELETE操作。

3.4. 函数示例

3.4.1. 示例1: 

  1. SQL> select userenv('language') from dual;
  2. USERENV('LANGUAGE')
  3. ----------------------------------------------------
  4. AMERICAN_AMERICA.ZHS16GBK

3.5. 基于Kingbase适配userenv函数功能的实现

3.5.1. 实现userenv(‘parameter’);函数

1、创建userenv函数的空壳,支持任意变量的输入。

  1. create or replace function userenv(anynonarray) returns anynonarray as $$    
  2. declare    
  3. begin    
  4.   case lower($1)    
  5.   when 'sessionid' then    
  6.     return get_session_id();    
  7.   when 'isdba' then    
  8.     return get_isdba();    
  9.   when 'action' then    
  10.     return get_action();    
  11.   when 'lang' then  
  12.     return get_lang();  
  13.   when 'language' then  
  14.     return get_language();  
  15.   else     
  16.     return null;    
  17.   end case;    
  18. end;    
  19. $$ language plpgsql strict;   
  20. CREATE FUNCTION

2、根据oracle中对应的例子去编写对应的实际函数

USERENV(‘SESSIONID’)

  • 创建一个序列
create sequence public.pg_session_id_sequence_oracle_comp;
  • 授权序列
grant all on sequence public.pg_session_id_sequence_oracle_comp to public;
  • 创建依赖函数
  1. create OR replace function get_session_id() returns int8 AS $$     
  2. declare res int8;     
  3. begin    
  4. SELECT currval('public.pg_session_id_sequence_oracle_comp') into res;     
  5. return res;     
  6. exception      
  7.     WHEN sqlstate '55000' THEN      
  8. SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;     
  9. return res;      
  10.     WHEN sqlstate '42P01' THEN      
  11. create sequence public.pg_session_id_sequence_oracle_comp;    
  12. SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;     
  13. return res;     
  14. end;     
  15. $$ language plpgsql strict SET client_min_messages to error;
  • 使用
  1. select userenv('sessionid'::Text);
  2.  USERENV
  3. ---------
  4.  1
  5. (1 行记录)

USERENV(‘ISDBA’)

  • 创建依赖函数 
  1. create OR replace function get_isdba() returns boolean AS $$     
  2.   select rolsuper from pg_roles where rolname=current_user;    
  3. $$ language sql strict SET client_min_messages to error;
  • 使用
  1. select userenv('isdba'::Text);
  2.  USERENV
  3. ---------
  4.  true
  5. (1 行记录)

USERENV(‘ACTION’)

  • 创建依赖函数
  1. create OR replace function get_ACTION() returns text AS $$     
  2.   select application_name from pg_stat_activity where pid=pg_backend_pid();    
  3. $$ language sql strict SET client_min_messages to error;
  • 使用
  1. select userenv('action'::Text);
  2.  USERENV
  3. ---------
  4.  psql
  5. (1 行记录)

USERENV(‘LANG’)

  • 创建依赖函数
  1. create OR replace function get_LANG() returns text AS $$     
  2.    select (regexp_split_to_array(current_setting('lc_messages'), '\.'))[1];    
  3. $$ language sql strict;
  • 使用
  1. select userenv('lang'::text);
  2.  USERENV
  3. ---------
  4.  en_US
  5. (1 行记录)

USERENV(‘LANGUAGE’)

  • 创建依赖函数
  1. create OR replace function get_LANGUAGE() returns text AS $$     
  2.     select (regexp_split_to_array(current_setting('lc_monetary'), '\.'))[1]||'.'||pg_client_encoding();  
  3.  $$ language sql strict;  
  • 使用
  1. select userenv('language'::text);
  2.   USERENV
  3. ------------
  4.  en_US.UTF8
  5. (1 行记录)

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树内置函数其它函数59737 人正在系统学习中

与[转帖]Kingbase实现Oracle userenv函数功能相似的内容:

[转帖]Kingbase实现Oracle userenv函数功能

目录 1. 问题 2. 文档概述 3. Oracle userenv()函数功能调研 3.1. 函数名称/函数原型 3.2. 函数功能 3.3. 参数介绍 3.3.1. Parameter 3.4. 函数示例 3.4.1. 示例1: 3.5. 基于Kingbase适配userenv函数功能的实现 3

[转帖]国产数据库到底行不行?人大金仓KINGBASE数据库与主流开源数据库性能实测

近年来,人大金仓的数据库产品受到了外界诸多的关注。做产品,免不了要接受用户的对比和选择,数据库因其行业的自身特点,还有很多开源的技术产品同台比拼,用户因此也会产生诸多疑问,国产数据库相比开源数据库到底如何,今天我们选择数据库的一项核心能力——性能,将金仓KingbaseES和目前业界主流的两种开源数

[转帖]Kingbase重新数据初始化,设置大小写

KingbaseV8数据库安装完成后,删除/opt/Kingbase/ES/V8/data下所有内容,重新在其他目录初始化数据库,设置为忽略大小写 [kingbase@dbserver bin]$ ./initdb -E UTF-8 -U SYSTEM -W kingbase2021 --case-

[转帖]kingbase(人大金仓)的一些常用表操作语句

包括 1)创建表 2)删除表 3)加字段 4)字段换名 5)字段改类型 6)字段添加注释 7)修改字段为自增类型 8)增加主键 9)查看模式下的表 一、创建和删除表 DROP TABLE IF EXISTS "DZ_RAIN" CASCADE; CREATE TABLE "DZ_RAIN" ( "I

[转帖]3.3.6. 活跃会话历史报告SYS_KSH

https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys-ksh sys_stat_activity 里记录的等待事件是瞬时信息,没有对等待事件的时间进行累计

[转帖]3.3.7. 自动诊断和建议报告SYS_KDDM

https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys-ksh KDDM 是 KingbaseES 性能自动诊断和建议的报告。它基于 KWR 快照采集的性能

[转帖]3.3.8. KWR运行期对比报告 KWR DIFF

https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys-ksh KWR报告是Diff报告的基础,在数据库运行过程中,通常在业务的高峰期和低谷期,或者在参数调

[转帖]15.1. 插件dblink简介

https://help.kingbase.com.cn/v8.6.7.12/development/sql-plsql/ref-extended-plug-in/dblink.html dblink是KingbaseES的一个扩展插件,支持在一个数据库会话中连接到其他Kingbase数据库的模块。

[转帖]2. 扩展插件概述

https://help.kingbase.com.cn/v8.6.7.12/development/sql-plsql/ref-extended-plug-in/plug-in.html KingbaseES开发了大量的扩展包。如:dbms_output,dbms_ddl,dbms_metadat

[转帖]5.3. 调整性能参数

https://help.kingbase.com.cn/v8/perfor/sql-optimization/sql-optimization-13.html SQL性能相关的参数较多,具体见下文。在使用时需注意作用范围,可以考虑通过HINT来指定,尽量缩小影响范围。 成本参数 节点开关参数 多表