1 问题场景:
在Oracle11g向DM8迁移的过程中,包在编译时报错函数[USERENV]无法解析。
2 原因分析:
达梦和Oracle的USERENV函数存在规则不同
3影响范围 :
编译失败"cMachine := USERENV('TERMINAL');"
4 具体分析:
4.1 Oracle中USERENV函数的具体含义用法及参数
USERENV返回当前会话的信息。此信息对于编写特定于应用程序的审计跟踪表或确定会话当前使用的特定于语言的字符非常有用。不能在CHECK约束条件下使用USERENV。参数参数的取值如下表所示。
所有对USERENV的调用都返回VARCHAR2数据,除了使用SESSIONID、SID和ENTRYID参数的调用,它们返回NUMBER。
Parameter | Return Value |
CLIENT_INFO | CLIENT_INFO返回最多64字节的用户会话信息,这些信息可以由使用DBMS_APPLICATION_INFO包的应用程序存储。 |
ENTRYID | 当前审计条目号。审计entryid序列在细粒度审计记录和常规审计记录之间共享。不能在分布式SQL语句中使用此属性。 |
ISDBA | 如果用户通过操作系统或密码文件被认证为具有DBA权限,ISDBA返回'TRUE'。 |
LANG | LANG返回语言名称的ISO缩写,比现有的' language '参数更短。 |
LANGUAGE | LANGUAGE以这种形式返回当前会话使用的语言和区域,以及数据库字符集:language_territory.characterset |
SESSIONID | SESSIONID返回审计会话标识符。不能在分布式SQL语句中指定此参数。 |
SID | SID返回会话ID。 |
TERMINAL | TERMINAL返回当前会话的终端的操作系统标识符。在分布式SQL语句中,此参数返回本地会话的标识符。 |
4.1.2 USERENV函数在Oracle中有以下两种用法:
1 SELECT USERENV('LANGUAGE') "Language" FROM DUAL; Language ----------------------------------- AMERICAN_AMERICA.WE8ISO8859P1 |
2 CONNECT OE Enter password: password SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') FROM DUAL; SYS_CONTEXT ('USERENV', 'SESSION_USER') --------------------------------------- OE |
4.2 DM中USERENV函数的具体含义用法及参数
4.2.1 USERENV 为系统默认的上下文名字空间,保存了用户的上下文信息
属性 | 说明 |
CURRENT_SCHEMA | 返回当前模式名 |
CURRENT_SCHEMAID | 返回当前模式ID |
CURRENT_USER | 返回当前的用户名 |
CURRENT_USERID | 返回当前的用户ID |
DB_NAME | 返回数据名 |
HOST | 返回客户端的主库名 |
INSTANCE_NAME | 返回实例名 |
IP_ADDRESS | 返回客户端的IP地址 |
ISDBA | 如果当前会话用户拥有DBA权限,则返回TRUE,否则返回FALSE |
LANG | 语言包简写,中文返回―CN‖,英文返回―EN‖ |
LANGUAGE | 语言包,返回库的编码方式 |
NETWORK_PROTOCOL | 通信协议 |
SERVER_HOST | 实例运行的主机名 |
SESSION_USER | 会话的用户名 |
SESSION_USERID | 会话的用户ID |
SID | 当前会话的ID |
4.2.2 USERENV函数在DM中只有以下一种用法:
SELECT LOCATION INTO V_LOCATION FROM MYKGIS.EMPLOYEE WHERE LASTNAME = SYS_CONTEXT('USERENV','SESSION_USER'); |
5 最终修改方案:
cMachine := USERENV('TERMINAL');
改为:
cMachine := SYS_CONTEXT('USERENV','TERMINAL');"
编译成功。
达梦技术社区:https://eco.dameng.com