达梦数据库版本:
DM:8.1.3.26
背景:
检查数据库JOBS时,一直提示语法错误:
执行语句:
SELECT JOB,SCHEMA_USER,LAST_DATE,LAST_SEC,NEXT_DATE,FAILURES,INSTANCE,INTERVAL FROM DBA_JOBS;
最终定位到是 INTERVAL 保留字的问题;
SQL> SELECT INTERVAL FROM DBA_JOBS;
SELECT INTERVAL FROM DBA_JOBS;
SELECT INTERVAL FROM DBA_JOBS;
*
第 1 行, 第 16 列[FROM]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.274(毫秒). 执行号:0.
按 * 执行,没有报错,自动转义了;
SELECT * FROM DBA_JOBS;
经测试保留字添加双引号后可以正常执行:
SELECT "INTERVAL" FROM DBA_JOBS;
不能用反引号
SQL> SELECT `INTERVAL` FROM DBA_JOBS;
SELECT `INTERVAL` FROM DBA_JOBS;
SELECT `INTERVAL` FROM DBA_JOBS;
*
第 1 行, 第 7 列[`]附近出现错误[-2007]:
语法分析出错.
已用时间: 0.235(毫秒). 执行号:0.
也不能使用单引号,会当成固定字符串。
SQL> SELECT 'INTERVAL' FROM DBA_JOBS;
行号 'INTERVAL'
---------- ----------
1 INTERVAL
2 INTERVAL
已用时间: 0.456(毫秒). 执行号:5245214.
疑问:
一.达梦保留字转义方法有哪些?
二.达梦数据库自带的系统表保留字查询时也需要特殊处理吗?
三.Oracle、MySQL数据库是否有类似情况?
一.达梦保留字转义方法有哪些?
参考链接:
https://eco.dameng.com/community/article/6ca6b591fecb40d2941e524af5fc25c9
作者:LeeWen
1.添加双引号
经测试关键字添加双引号后可以正常执行:
SELECT "INTERVAL" FROM DBA_JOBS;
2.数据库配置文件dm.ini中EXCLUDE_RESERVED_WORDS参数
EXCLUDE_RESERVED_WORDS:
语法解析时,需要去除的保留字列表,保留字之间以逗号分隔。默认为空,静态参数。
V$RESERVED_WORDS视图中RES_FIXED=N的关键字通过EXCLUDE_RESERVED_WORDS参数设置之后将会失效,V$RESERVED_WORDS视图不会再记录。
或者disql进入数据库实例,执行以下命令:
sp_set_para_string_value(2,'EXCLUDE_RESERVED_WORDS','xxx');
重启数据库服务生效
3.dm_svc.conf配置文件中KEYWORDS配置项
使用时需要注意,在dm_svc.conf文件中配置KEYWORDS时,KEYWORDS应配置在"服务配置区"中,不应直接配置到"全局配置区"。
示例:
KEYWORDS=(xxx,yyy.zzz)
4.客户端连接字符串url屏蔽指定关键字
示例:
jdbc:dm://192.1.1.100:5236/CJC?keywords=(xxx,yyy,zzz)
二.达梦数据库自带的系统表保留字查询时也需要特殊处理吗?
是的,需要转义
SELECT "INTERVAL" FROM DBA_JOBS;
三.Oracle、MySQL数据库是否有类似情况
Oracle:11.2.0.4.0
Oracle可以正常查询
但并不是Oracle数据库自带的系统表保留字查询时不需要特殊处理,而是因为INTERVAL不是Oracle的保留字。
INTERVAL不属于保留字
SQL> col interval for a30
SQL> select INTERVAL from dba_jobs where rownum alter table t1 add `INTERVAL` int;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
需要使用反引号进行转义
mysql> select `INTERVAL` from t1;
单引号和双引号不能进行转义会被识别为固定字符
mysql> select 'INTERVAL' from t1;
mysql> select "INTERVAL" from t1;
总结:
1.达梦、Oracle、MySQL保留字名称、数量有很大差异;
例如:
INTERVAL 在 达梦和MySQL数据库中属于保留字,在Oracle中不属于保留字,如果涉及Oracle迁移达梦数据库,需要考虑保留字的影响。
2.达梦、Oracle、MySQL保留字转义方式不同;
达梦和Oracle使用双引号进行转义;
MySQL使用反引号进行转义;
3.达梦、Oracle、MySQL数据库系统表中的保留字也需要转义,和普通表无区别。
###chenjuchao 20231206###