目录

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函数功能的更多相关文章

  1. ORACLE USERENV函数

    ORACLE USERENV函数 USERENV返回关于当前会话的信息.此信息可以用于编写一个应用程序特定的审计跟踪表或确定特定于语言的角色目前使用的会话. 参数 功能 CLINET_INFO 返回最 ...

  2. Oracle DECODE函数的语法介绍

    Oracle DECODE函数功能很强,下面就为您详细介绍Oracle DECODE函数的用法,希望可以让您对Oracle DECODE函数有更多的了解. Oracle DECODE函数 Oracle ...

  3. oracle实现split函数功能

    转载: http://blog.csdn.net/jojo52013145/article/details/6758279在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 R ...

  4. Oracle over函数

    Oracle over函数   SQL code: sql over的作用及用法RANK ( ) OVER ( [query_partition_clause] order_by_clause )DE ...

  5. Oracle常用函数

    前一段时间学习Oracle 时做的学习笔记,整理了一下,下面是分享的Oracle常用函数的部分笔记,以后还会分享其他部分的笔记,请大家批评指正. 1.Oracle 数据库中的to_date()函数的使 ...

  6. MSSQL和Oracle常用函数比对

    数学函数 序号 函数功能 SQL Server用法 Oracle用法 1 绝对值 select abs(-1) value select abs(-1) value from dual 2 取整(大) ...

  7. ORACLE 日期函数

    ORACLE 日期函数 SYSDATE  当前的数据库系统时间 ADD_MONTHS(加减指定的月份) MONTHS_BETWEEN(取两个日期之间相隔的月数) LAST_DAY(取指定日期所在月的最 ...

  8. Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace

    Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace   --去掉所有特殊字符,只剩字母  SELECT REGEXP ...

  9. Oracle中函数/过程返回结果集的几种方式

    原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式:    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.    ...

  10. Oracle SQL函数之数学函数

    Oracle SQL函数之数学函数 ABS(x) [功能]返回x的绝对值 [参数]x,数字型表达式 [返回]数字 SQL> SELECT ABS(),ABS(-) FROM DUAL; ABS( ...

随机推荐

  1. C++通过文件指针获取文件大小

    目录 1. 叙述 2. 结论 1. 叙述 对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取.网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计算出文件的大小.但是我总觉得这样做可 ...

  2. 分门别类输入输出,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本数据类型和输入输出EP03

    前文再续,Go lang和Python一样,基础数据类型有着很多分类,分门别类,一应俱全.它们对应着不同的使用场景,分别是:整形.浮点.字符.字符串.布尔等等.常用的基本数据类型经常会参与日常业务逻辑 ...

  3. Java 插入、隐藏/显示、删除Excel行或列

    概述 操作Excel工作表时,对表格中的行或列数据可执行,包括插入.隐藏.显示.删除等在内的多种操作需求,本文将通过Java代码示例演示每种操作的具体实现方法.文中方法使用了Java Excel类库( ...

  4. MindSpore实践:对篮球运动员目标的检测

    摘要:本文讲述的是MindSpore对篮球运动员目标的检测应用,通过AI技术辅助对篮球赛场进行分析. 本文分享自华为云社区<MindSpore大V博文系列:AI对篮球运动员目标的检测>,原 ...

  5. 关于Spring注解开发教程,打包全送你

    摘要:spring是我们web开发中必不可少的一个框架,基于传统的xml方式配置bean总觉得太过繁琐,从spring2.5之后注解的出现可以大大简化我们的配置. 本文分享自华为云社区<如何高效 ...

  6. Java变异出现错误:No enclosing instance of type XXX is accessible

    摘要:写java代码时遇到下面的编译错误. 本文分享自华为云社区<Java中出现No enclosing instance of type XXX is accessible问题>,作者: ...

  7. iOS加固保护新思路

    ​ 技术简介 前言 iOS加固保护是基于虚机源码保护技术,针对iOS平台推出的下一代加固产品.可以对iOS APP中的可执行文件进行深度混淆.加固,并使用独创的虚拟机技术对代 码进行加密保护,使用任何 ...

  8. 实用指南:手把手搭建坚若磐石的DevSecOps框架

    长期以来,安全问题一直被当作软件开发流程中的最后一步.开发者贡献可以实现软件特性的代码,但只在开发生命周期的测试和部署阶段考虑安全问题.随着盗版.恶意软件及网络犯罪事件飙升,开发流程需要做出改变. 开 ...

  9. 7z压缩测试

    注意: CompressionLevel 选择

  10. Runnable接口的 run() 方法和start()方法

    1.start()方法来启动线程,真正实现了多线程运行.这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码:通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就 ...