目录

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. MongoDB 安装、配置及详细使用教程

    环境:win10 下载地址 :https://pan.baidu.com/s/1a0SwRv9er3HTewzcI8nWgQ      提取码:dyyx   下载后,将该文件夹放在C盘的根目录下,然后 ...

  2. ThreadLocal真的会造成内存泄漏吗?

    ThreadLoca在并发场景中,应用非常多.那ThreadLocal是不是真的会造成内存泄漏?今天给大家做一个分享,个人见解,仅供参考. 1.ThreadLocal的基本原理 简单介绍一下Threa ...

  3. nginx 超时

    知识点小记,nginx默认1min超时返回,nginx.conf->http中添加: proxy_read_timeout 600; *600就是10分钟,理论上后台接口不应该这么搞,但实际上项 ...

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

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

  5. 神经网络入门篇:详解深层网络中的前向传播(Forward propagation in a Deep Network)

    深层网络中的前向传播 先说对其中一个训练样本\(x\)如何应用前向传播,之后讨论向量化的版本. 第一层需要计算\({{z}^{[1]}}={{w}^{[1]}}x+{{b}^{[1]}}\),\({{ ...

  6. Karmada:让跨集群弹性伸缩FederatedHPA突破新边界

    本文分享自华为云社区<Kubernetes多集群管理Karmada,跨集群弹性伸缩FederatedHPA突破新边界!>,作者:华为云云原生团队. 根据 Flexera 最新发布的< ...

  7. vue2升级vue3:getCurrentInstance—Composition api/hooks中如何获取$el

    在vue2中,我们进程看到 this.$el 操作.但是在vue3 如何获取组件的当前 dom 元素呢?  可以利用 getCurrentInstance getCurrentInstance Vue ...

  8. 第六届蓝桥杯C++C组 A~F题题解

    蓝桥杯历年国赛真题汇总:Here 1. 分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, ...

  9. Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举)

    1519A. Red and Blue Beans 问题简述 给定 \(r\) 个红豆,\(b\) 个蓝豆,差值 \(d\) ,要求我们进行为红蓝豆分组,使得红豆和蓝豆绝对值差值不大于 \(d\) , ...

  10. AtCoder Beginner Contest 187 题解

    A - Large Digits 按要求求出两个数的每位之和,进行比较即可. 时间复杂度 \(\mathcal{O}(\log(AB))\). B - Gentle Pairs 枚举所有点对求斜率. ...