暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

磐维数据库2.0系列:oracle兼容性之sys_context函数

原创 #5z# ๑҉ 2024-01-25
1116

磐维数据库,简称"PanWeiDB"。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。其产品内核能力基于openGauss开源软件,并进一步提升了系统稳定性及多种数据库兼容性。

在一个Oracle迁移项目中,有张表迁移数据时遇到如下错误:

code: 42883 msg: function sys_context(unknown, unknown) does not exist

目标库使用的是PanWeiDB 1.0,还不支持sys_context函数,PanWeiDB 2.0可以使用sys_context函数,下面将介绍sys_context函数的具体使用示例。

sys_context函数的语法格式

语法格式如下:

sys_context('namespace', 'parameter' [, length ])

sys_context函数的参数说明

namespace参数是命名空间,目前只支持USERENV命名空间。

parameter参数是用户查询的参数,目前支持如下参数:

序号 参数名称 描述
1 action 通过dbms_application_info.set_action设置
2 client_info 通过dbms_application_info.set_client_info设置
3 client_program_name 会话的客户端程序名称
4 current_edition_id 数据库的版本号
5 current_edition_name 数据库的版本信息
6 current_schema 查询路径
7 current_schemaid 当前schema的oid标识
8 current_user 当前用户名
9 current_userid 当前用户的oid标识符
10 database_role 当前用户名
11 db_name 数据库名称
12 db_unique_name 数据库名称
13 host 客户端主机名称
14 ip_address 服务器ip地址
15 is_superuser 用户是否有sysadmin权限
16 lang 当前db语言环境的简化形式
17 language 当前db语言环境的详细形式
18 module 通过dbms_application_info包设置
19 network_protocol 通信网络协议
20 nls_calendar 会话的当前日历
21 nls_currency 会话的货币符号
22 nls_date_format 会话的日期格式
23 nls_date_language 会话日期的语言
24 nls_sort 排序方式
25 nls_territory 会话的所处地
26 vast_home 数据库主目录路径
27 os_user 操作系统用户名
28 platform_slash 操作系统文件路径分隔符
29 server_host 数据库主机名
30 service_name 当前连接的数据库名
31 session_default_collation 会话的collation
32 session_edition_id 数据库版本号
33 session_edition_name 数据库版本信息
34 session_user 会话用户名称
35 session_userid 会话用户的oid
36 sid sid
37 terminal 当前会话的客户端的操作系统标识,返回本地会话的标识符

sys_context函数的常用示例

1.获取action

postgres=# exec dbms_application_info.set_action('myAction'); set_action ------------ (1 row) postgres=# select sys_context('userenv','action'); sys_context ------------- myAction (1 row)

2.获取client_info

postgres=# select sys_context('userenv','client_info'); sys_context ------------- client A (1 row)

通过dbms_application_info.set_client_info设置后再获取

postgres=# exec dbms_application_info.set_client_info('my gsql client'); set_client_info ----------------- (1 row) postgres=# select sys_context('userenv','client_info'); sys_context ---------------- my gsql client (1 row)

3.获取客户端程序名称

会话的客户端程序名称

postgres=# select sys_context('userenv','client_program_name'); sys_context ------------- gsql (1 row)

4.获取数据库的版本号

数据库的版本号

postgres=# select sys_context('userenv','current_edition_id'); sys_context ------------- 2.0.0 (1 row)

5.获取数据库的版本信息

数据库的版本信息,相当于pw_version()返回信息

postgres=# select sys_context('userenv','current_edition_name'); sys_context ------------------------------------------------------------------------- (PanWeiDB 2.0.0 (Build0)) compiled at 2023-11-30 10:41:56 commit 03b85d1 last mr + product name:PanWeiDB + version:2.0.0 + patch:0 + commit:03b85d1 + openGauss version:5.0.0 + host:aarch64-unknown-linux-gnu (1 row)

6.获取当前查询路径

当前用户的查询路径,即search_path值

postgres=# select sys_context('userenv','current_schema'); sys_context ---------------- "$user",public (1 row)

上面是默认的查询路径,修改后再观察:

postgres=# set search_path to public; SET postgres=# select sys_context('userenv','current_schema'); sys_context ------------- public (1 row)

7.获取当前schema的oid标识

postgres=# set search_path to public; SET postgres=# select sys_context('userenv','current_schemaid'); sys_context ------------- 2200 (1 row) postgres=# select 2200::regnamespace; regnamespace -------------- public (1 row)

8.获取当前user

postgres=# select sys_context('userenv','current_user'); sys_context ------------- panwei (1 row)

9.获取当前userid

postgres=# select sys_context('userenv','current_userid'); sys_context ------------- 10 (1 row)

10.获取database_role

与第8项类似

postgres=# select sys_context('userenv','database_role'); sys_context ------------- panwei (1 row)

11.获取当前连接的数据库名称

\c panweidb panweidb=# select sys_context('userenv','db_name'); sys_context ------------- panweidb (1 row)

12.获取db_unique_name

与第11项类似

panweidb=# select sys_context('userenv','db_unique_name'); sys_context ------------- panweidb (1 row)

13.获取客户端主机名称

panweidb=# select sys_context('userenv','host'); sys_context ------------- node1 (1 row)

14.获取服务器ip地址

panweidb=# select sys_context('userenv','ip_address'); sys_context ------------- 192.168.20.200 (1 row)

15.获取is_superuser

当前用户是否有sysadmin权限

panweidb=# select sys_context('userenv','is_superuser'); sys_context ------------- TRUE (1 row)

16.获取lang

当前db语言环境的简写形式

panweidb=# select sys_context('userenv','lang'); sys_context ------------- en_US (1 row)

17.获取language

当前db语言环境的详细形式

panweidb=# select sys_context('userenv','language'); sys_context ------------- en_US.UTF-8 (1 row)

18.获取module

panweidb=# exec dbms_application_info.set_module('module_panwei','action1'); set_module ------------ (1 row) panweidb=# select sys_context('userenv','module'); sys_context --------------- module_panwei (1 row)

19.获取通信网络协议

网络协议,固定为tcp

panweidb=# select sys_context('userenv','network_protocol'); sys_context ------------- tcp (1 row)

20.获取当前日历

默认为空

panweidb=# select sys_context('userenv','nls_calendar'); sys_context ------------- (1 row)

21.获取货币符号

panweidb=# select sys_context('userenv','nls_currency'); sys_context ------------- $ (1 row)

22.获取日期格式

panweidb=# select sys_context('userenv','nls_date_format'); sys_context -------------- YEAR-MON-DAY (1 row)

23.获取日期格的语言

panweidb=# select sys_context('userenv','nls_date_language'); sys_context ------------- English (1 row)

24.获取排序方式

当前排序方式固定为BINARY

panweidb=# select sys_context('userenv','nls_sort'); sys_context ------------- BINARY (1 row)

25.获取nls_territory

panweidb=# select sys_context('userenv','nls_territory'); sys_context ------------- CHINA (1 row)

26.获取数据库主目录路径

panweidb=# select sys_context('userenv','vast_home'); sys_context ------------------ /opt/panweidb200 (1 row)

27.获取操作系统用户名

panweidb=# select sys_context('userenv','os_user'); sys_context ------------- omm (1 row)

28.获取操作系统文件路径分隔符

panweidb=# select sys_context('userenv','platform_slash'); sys_context ------------- / (1 row)

29.获取数据库主机名

panweidb=# select sys_context('userenv','server_host'); sys_context ------------- node1 (1 row)

30.获取service_name

service_name在磐维数据库指当前连接的数据库名

panweidb=# select sys_context('userenv','service_name'); sys_context ------------- panweidb (1 row)

31.获取collation

panweidb=# select sys_context('userenv','session_default_collation'); sys_context ------------- en_US.UTF-8 (1 row)

32.获取数据库版本号

panweidb=# select sys_context('userenv','session_edition_id'); sys_context ------------- 2.0.0 (1 row)

33.获取数据库的版本信息

数据库的版本信息,相当于pw_version()返回信息

panweidb=# select sys_context('userenv','session_edition_name'); sys_context ----------------------------------------------------------------------- (PanWeiDB 2.0.0 (Build0)) compiled at 2023-11-30 10:41:56 commit 03b85d1 last mr + product name:PanWeiDB + version:2.0.0 + patch:0 + commit:03b85d1 + openGauss version:5.0.0 + host:aarch64-unknown-linux-gnu (1 row)

34.获取会话用户名称

panweidb=# select sys_context('userenv','session_user'); sys_context ------------- panwei (1 row)

35.会话用户的oid

panweidb=# select sys_context('userenv','session_userid'); sys_context ------------- 10 (1 row)

36.获取sid

当前的sid值默认为0

panweidb=# select sys_context('userenv','sid'); sys_context ------------- 0 (1 row)

37.获取terminal

会话的客户端标识,返回本地会话的标识符,与第13项输出一致。

panweidb=# select sys_context('userenv','terminal'); sys_context ------------- node1 (1 row)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论