目录

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. 为什么maven配置完Tomcat且运行之后页面内容没有显示出来?

    1.如何在maven项目中配置一个webapp项目? 首先新建一个maven项目 项目目录 <?xml version="1.0" encoding="UTF-8& ...

  2. 常见的Java中SQL注解的用法

    @Select:用于查询操作,标注在方法上,指定相应的SQL查询语句. @Select("SELECT * FROM table_name WHERE condition") Li ...

  3. 华为云弹性云服务器ECS搭建FTP服务实践

    摘要:在使用华为弹性云服务器ECS搭建FTP服务的时候,经常会遇到搭建完成后无法访问的问题.本篇通过演示windows IIS搭建FTP方法,讲解ftp主动模式.被动模式原理来说明无法访问的原因及解决 ...

  4. 探秘华为云盘古大模型:AI for industries的身体力行

    摘要:大模型是新一轮AI发展的核心,其已在推进产业智能化升级中已表现出巨大潜力,并将在未来三年里形成风起云涌之势. 本文分享自华为云社区<探秘华为云盘古大模型:AI for industries ...

  5. 详解SQL优化必备:并行执行框架和执行计划

    摘要:在关系型数据库中,优化器是数据库的核心组件之一,由于一些列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划. 本文分享自华为云社区<华为云Gaus ...

  6. 海量数据分析快准稳!GaussDB(for MySQL) HTAP只读分析特性详解

    摘要:除了拥有 ClickHouse 本身的极致性能外,GaussDB(for MySQL)的HTAP只读分析在 MaterilizeMySQL引擎的性能和稳定性等方面具有更优秀的表现,为提供更快更准 ...

  7. 火山引擎DataLeap数据调度实例的 DAG 优化方案 (二):功能设计

    针对上面存在的问题以及对需求的分析,我们可以进行如下的功能实现与设计: 首先是渲染方案的替换,将 svg 的渲染方案替换成 canvas 渲染,通过减少页面中 DOM 的数量,提高前端渲染性能. 其次 ...

  8. Java 日志框架学习笔记

    日志概念 1. 日志文件 日志文件是用于记录系统操作事件的文件集合 1.1 调试日志 1.2 系统日志 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...

  9. WCF 动态调用 动态代理

    关键词:WCF动态调用.动态调用WCF.WCF使用动态代理精简代码架构.使用反射执行WCF接口 代码地址: https://gitee.com/s0611163/DynamicWCF https:// ...

  10. C#9.0:Init

    背景 在以前的C#版本里面,如果需要定义一个不可修改的的类型的做法一般是:声明为readonly,并设置为只包含get访问器,不包含set访问器.如下: 1 public class PersonIn ...