最后测试了一下UPDATE子查询方式,显然这也是达梦数据库所不支持的,不过这种语法在Oracle8i中已经出现了。另一种通过子查询同时更新多个列的写法也是不支持的。
server name:localhost
user name:sysdba
password:
port:12345
dm_login time used:43.856(ms)
SQL>select * from dual;
select * from dual;
SYSDUAL_COL
1 1
1 rows got
time used: 40.933(ms) clock tick:68373830.
达梦为了兼容Oracle还特意构造了一个DUAL表。虽然字段名称以及记录的值和Oracle并不相同,但是无论是字段名还是记录的值都是不重要的,重要的是表中只有一个字段且只有一条记录。
简单总结一下,达梦数据库在文档中说已经支持Oracle8i的语法,当时看到这种说明心里不以为然,要知道Oracle有很多语法是SQL92标准所不支持的,比如查询子查询、外连接、树形查询等等。
但是测试的结果确实出乎意料,进行了众多的测试,既然只有寥寥几种写法是达梦不支持的,其中还要去掉MERGE语句,因为这是9i才引入的新特性。
除了支持SQL92语法,以及一些常见的语法外,达梦还支持下列Oracle特有的语法:包括树形查询、外连接、ROWNUM伪列、LEVEL伪列、DUAL表、标准分页查询、甚至包括子查询作为查询列。
其中达梦对于树形查询的支持比较出乎意料,不仅支持LEVEL伪列,还支持CONNECT_IS_LEAF和CONNECT_IS_CYCLE伪列,还支持CONNECT BY NOCYCLE语句,以及CONNECT_BY_ROOT操作、SYS_CONNECT_BY_PATH函数。虽然达梦中所有树形查询的语法并没有超过Oracle中的语法,但是这些伪列、函数和操作已经远远超过8i中Oracle的语法了,已经完全可以支持Oracle10g中树形查询的语法和功能了。
而在不支持的特性包括分析函数、ROLLUP和CUBE相关的GROUP BY语句、ORDER BY语句中的NULLS FIRST或NULLS LAST语句、UPDATE或DELETE子查询语句。其中分析函数不支持再正常不过,这是Oracle提供的一个独特的强大工具,能在记录行级进行排序、分区等复杂的操作。而GROUP BY的ROLLUP和CUBE的实现应该不算太复杂,不过毕竟这部分更多的是用在数据仓库中,在OLTP环境下很少可以用到,不支持也不会有多大的影响。而ORDER BY中的NULLS FIRST和NULLS LAST语句不支持就不太应该了,这应该是经常会使用的功能,而且实现起来应该也很容易,怀疑是被遗漏的功能。至于UPDATE或DELETE子查询,这也是Oracle非常独特的写法,其中还涉及键值保留表的概念,因此不支持也是在情理之中。但是对于根据查询结果同时更新多个列的情况还是比较常见的,这种写法不但简单,而且可以避免子查询执行多次,这种UPDATE方式还是应该支持的。
从目前看,将8i的SQL的语句迁移到达梦数据库上而不做修改还是可行的,九成以上的功能都已经实现了。不过在Oracle的9/10/11版本中,又增加了大量的新的语法,比如MERGE、INSERT ALL、WITH、AS OF、MODEL等等,如果达梦的新版本想要兼容Oracle新版本中的语法,还是有不少难度的。