2020-12-21 23:02:39
Oracle与DB2在SQL语法及功能上存在多处差异,主要体现在以下方面:
1. 创建类似表语法
Oracle使用CREATE TABLE a AS SELECT * FROM b直接通过查询结果创建表,保留数据与结构;DB2早期版本(如V8)支持CREATE TABLE a LIKE b仅复制结构,但V9后失效,改用CREATE TABLE new_a AS SELECT col1,col2... FROM a DEFINITION ONLY仅复制结构无数据。
2. 清空大表操作
Oracle的TRUNCATE TABLE a直接清空数据且不可回滚;DB2需通过ALTER TABLE a ACTIVE NOT LOGGED INITIALLY WITH EMPTY TABLE实现类似效果,操作更复杂但可减少日志生成。
3. 分页查询语法
Oracle用WHERE ROWNUM <= N限制返回行数;DB2采用标准SQL语法FETCH FIRST N ROWS ONLY,更符合ANSI标准。
4. 系统时间获取方式
Oracle通过SELECT SYSDATE FROM DUAL获取当前日期时间;DB2使用SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1,需指定虚拟表SYSIBM.SYSDUMMY1。
5. 空值处理函数
Oracle的NVL(col3,'0')判断字段是否为空并替换;DB2用VALUE(col3,'0')实现相同功能,同时支持COALESCE(col3,'0')处理多参数空值替换,返回第一个非空值。
6. 数据类型转换函数
Oracle提供TO_CHAR、TO_DATE、TO_NUMBER等专用函数,如TO_CHAR(SYSDATE,'YYYY-MM-DD')格式化日期;DB2使用VARCHAR()、DATE()等类型转换函数,如VARCHAR(CURRENT TIMESTAMP)将时间转为字符串,V9后新增TO_NUMBER函数。
7. 递归查询语法
Oracle通过CONNECT BY PRIOR和START WITH实现层次查询,如从子节点向上追溯父节点;DB2需借助WITH RECURSIVE虚拟表,通过UNION ALL递归关联实现类似功能,语法更复杂但符合标准。
8. 其他差异