目录

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. 在线录屏-通过Web API接口轻松实现录屏

    在线录屏是指在互联网上进行屏幕录制的过程.它允许用户通过网络连接,将自己的屏幕活动记录下来,并可以在需要时进行播放.共享或存档.在线录屏常用于教育.培训.演示.游戏等场景,可以帮助用户展示操作步骤.解 ...

  2. Java 在PDF中绘制形状(基于Spire.Cloud.SDK for Java)

    Spire.Cloud.SDK for Java提供了pdfPathApi接口可用于在PDF文档中绘制形状(或图形),如绘制线条形状drawLine().绘制矩形形状drawRectanglef(), ...

  3. 创新 = 颠覆?AI创新如何做大蛋糕

    本文分享自华为云社区<创新 = 颠覆?AI创新如何做大蛋糕>,作者: 华为云PaaS服务小智 . 最近随着AI的风靡,各行各业都充斥着近乎疯狂的言论,"AI必将替代一切" ...

  4. WSDM Cup 2020大赛金牌参赛方案全解析

    近日,在美国休斯敦闭幕的第13届网络搜索与数据挖掘国际会议(WSDM 2020)上,华为云语音语义创新Lab带领来自华南理工大学.华中科技大学.江南大学.武汉大学的四位学生组成的联合团队"X ...

  5. 火山引擎ByteHouse:ClickHouse如何保证海量数据一致性

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 ClickHouse是一个开源的OLAP引擎,不仅被全球开发者广泛使用,在字节各个应用场景中也可以看到它的身 ...

  6. Java Sprintboot jar 项目启动、停止脚本

    将 vipsoft-gateway-1.0.0 替换成自己的包名 start-gateway-dev.sh nohup java -Duser.timezone=GMT+08 -Dfile.encod ...

  7. 【AI 安全探索】AI 流行的时代,我们应该担心什么?

    视频地址:https://www.bilibili.com/video/BV1eg4y1Q7N5/ 是未来危机,还是眼下的问题? Sasha Luccioni 是 Hugging Face 团队的道德 ...

  8. AtCoder Beginner Contest 214 (D并查集,E反悔贪心,F公共子序列DP)

    题目链接:Here ABC水题, D - Sum of Maximum Weights 上图中最大权 \(9\) 对答案的贡献是这条边两边的连通块的 size 的乘积再乘以 9 受到上面的启发,我们可 ...

  9. 2016年第七届 蓝桥杯A组 C/C++决赛题解

    蓝桥杯历年国赛真题汇总:Here 1.随意组合 小明被绑架到X星球的巫师W那里. 其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7) 他命令小明从一组数据中分别取数与另一组中的数配对 ...

  10. Django 对实体的增删改查样例

    class UserInfo(models.Model): """ 人员信息 """ user_id = models.CharField( ...