前言
当在达梦数据库中创建表等对象时,对象名称使用一些单词时可能会遇到创建失败报错“语法分析错误”,这种情况有可能是遇到了使用的对象名为系统保留字的无法使用。针对这种情况,一般建议修改对象名为系统保留字之外的名称。如果是现有的系统上,一定要使用系统保留字,那么对于部分系统保留字(非所有)可以通过参数屏蔽的方式来处理。
达梦数据库中排除屏蔽系统保留字的方法有两种:
第一种:修改数据库dm.ini中参数EXCLUDE_RESERVED_WORDS
第二种:配置客户端dm_svc.conf文件,添加KEYWORDS配置项(推荐)
参数介绍
1、数据库配置文件dm.ini中EXCLUDE_RESERVED_WORDS参数
EXCLUDE_RESERVED_WORDS:语法解析时,需要去除的保留字列表,保留字之间以逗号分隔。默认为空,静态参数。
V$RESERVED_WORDS视图中RES_FIXED=N的关键字通过EXCLUDE_RESERVED_WORDS参数设置之后将会失效,V$RESERVED_WORDS视图不会再记录。
2、dm_svc.conf配置文件中KEYWORDS配置项
KEYWORDS:标识用户关键字,所有在列表中的字符串,如果以单词的形式出现在SQL语句中,则这个单词会被加上双引号。该配置项主要用来解决用户需要使用DM8中的保留字作为对象名使用的状况。
使用时需要注意,在dm_svc.conf文件中配置KEYWORDS时,KEYWORDS应配置在"服务配置区"中,不应直接配置到"全局配置区"。
3、V$RESERVED_WORDS视图
V$RESERVED_WORDS视图记录了数据库系统关键字的相关信息。视图字段含义如下(参考《DM8系统管理员手册》):
KEYWORD:关键字名字
LENGTH:关键字长度
RESERVED:是否是保留字
RES_SQL:是否是SQL保留字,不能作SQL中的标识符
RES_PL:是否是DMSQL程序保留字,不能作DMSQL程序语句块中的标识符
RES_SCHEMA:是否是模式保留字,不能作模式标识符
RES_VARIABLE:是否是变量保留字,不能作变量标识符
RES_ALIAS:是否是别名保留字,不能作别名标识符
RES_FIXED:关键字是否可以EXCLUDE,Y不可以,N可以
注意:
V$RESERVED_WORDS视图中RESERVED=Y的关键字为系统保留字,无法直接在SQL语句中使用。RES_FIXED=Y的保留字是不能屏蔽的,屏蔽会影响使用。
在DM8 1-1-190版本中不能屏蔽的关键字有77个。
使用示例
环境说明
DB:DMV8 1-1-190版本
OS:KylinV10
测试关键字以PERCENT、ORDER为例。其中PERCENT为可排除关键字,ORDER为不可排除关键字。
确认关键字信息:
SQL> select * from v$reserved_words where keyword in ('PERCENT','ORDER');
行号 KEYWORD LENGTH RESERVED RES_SQL RES_PL RES_SCHEMA RES_VARIABLE RES_ALIAS RES_FIXED
---------- ------- ----------- -------- ------- ------ ---------- ------------ --------- ---------
1 ORDER 5 Y Y Y N N N Y
2 PERCENT 7 Y Y Y N N N N
第一种方法:修改dm.ini中EXCLUDE_RESERVED_WORDS参数
(1)创建两张表包含测试的关键字(直接使用保留字作为列名)
SQL> create table A (PERCENT VARCHAR(10));
create table A (PERCENT VARCHAR(10));
create table A (PERCENT VARCHAR(10));
*
第 1 行, 第 35 列[PERCENT]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.459(毫秒). 执行号:0.
SQL> create table B (ORDER VARCHAR(10));
create table B (ORDER VARCHAR(10));
create table B (ORDER VARCHAR(10));
*
第 1 行, 第 33 列[ORDER]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.323(毫秒). 执行号:0.
SQL>
(2)修改dm.ini中EXCLUDE_RESERVED_WORDS参数
修改后参数为:EXCLUDE_RESERVED_WORDS =PERCENT,ORDER
重启数据库。
(3)创建测试表
SQL> create table A (PERCENT VARCHAR(10));
操作已执行
已用时间: 16.635(毫秒). 执行号:400.
SQL> create table B (ORDER VARCHAR(10));
create table B (ORDER VARCHAR(10));
create table B (ORDER VARCHAR(10));
*
第 1 行, 第 33 列[ORDER]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.409(毫秒). 执行号:0.
通过测试可以发现对于RES_FIXED=Y的保留字,修改dm.ini中EXCLUDE_RESERVED_WORDS参数是无法屏蔽的,对RES_FIXED=N的保留字可以屏蔽。
其余的RES_FIXED=Y的保留字也可以多测试几个。
第二种方法:配置dm_svc.conf文件,添加KEYWORDS配置项
(1)在客户端机器上配置dm_svc.conf文件,添加KEYWORDS配置项
dm_svc.conf 配置如下:
# 全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DB1=(192.168.15.35:5236)
[DB1]
# 服务配置区
KEYWORDS=PERCENT,ORDER
dm_svc.conf文件在不同平台上的存放路径可以参考《DM8系统管理员手册》。
针对数据库的配置最好是添加在“服务配置区”中,避免存在其他数据库的情况下影响到其他数据库,而且通过配置dm_svc.conf服务名对应用程序更方便。
(2)使用配置的服务名连接
管理工具登录:
创建测试表,均创建成功:
SQL> desc AA;
行号 NAME TYPE$ NULLABLE
---------- ------- ----------- --------
1 PERCENT VARCHAR(10) Y
已用时间: 31.550(毫秒). 执行号:1200.
SQL> desc BB;
行号 NAME TYPE$ NULLABLE
---------- ----- ----------- --------
1 ORDER VARCHAR(10) Y
已用时间: 13.170(毫秒). 执行号:1201.
通过测试可以发现对于RES_FIXED=Y的保留字,dm_svc.conf也可以进行屏蔽,但是屏蔽之后可能会导致使用上的问题。
(3)dm_svc.conf屏蔽RES_FIXED=Y的保留字会导致的问题
以ORDER为例:
通过dm_svc.conf屏蔽后,使用dm_svc.conf进行连接的程序,将无法使用数据库中自带的包含单独的order单词的函数等,将会导致程序功能异常。
比如order by等将无法使用:
比如管理工具等程序部分功能出现异常:
注意: 通过dm_svc.conf对保留字进行屏蔽,只影响通过dm_svc.conf进行连接的应用程序,不使用dm_svc.conf不会影响。如下图演示:
总结
(1)对于有使用到系统关键字保留字的所有SQL语句和对象名称,最优选是修改SQL语句和对象名称;
(2)对于必须需要数据库进行屏蔽的关键字,建议使用dm_svc.conf文件进行屏蔽,尽量减少影响;
(3)RES_FIXED=Y的保留字是不能屏蔽的,屏蔽之后会影响使用;
(4)如果对象名称加上双引号,即使对象名称是未屏蔽的保留字,对象也可以创建成功。但是在该对象名称上使用SQL语句时,也需要给对象名称加上双引号。
(5)更多资讯请上达梦技术社区了解:https://eco.dameng.com