IBM DB2 for Linux, UNIX, and Windows 9.7 提供了许多激动人心的新特性,其中最重要的一个就是对 Oracle SQL 和 PL/SQL 的支持,它支持 PL/SQL 许多语法,使得从 Oracle 到 DB2 的迁移变的更加容易。

开始了解这些新特性:


Oracle 兼容特性

1. 隐式强制类型转换(弱类型),这将减少对 DB2 启用当前在其他数据服务器上运行的应用程序时需要修改的 SQL 数量。

2. TIMESTAMP_FORMAT 和 VARCHAR_FORMAT 标量函数的性能大幅提高。(TO_DATE 和 TO_TIMESTAMP 是 TIMESTAMP_FORMAT 的同义词,而 TO_CHAR 是 VARCHAR_FORMAT 的同义词。)

  • TIMESTAMP_FORMAT - 此函数以指定格式返回基于输入字符串的解释的时间戳记。
  • VARCHAR_FORMAT - 此函数返回输入表达式的字符串表示,该表示已根据指定的字符模板进行格式化。

3. 撤销了多项 SQL 语言限制,这使得产品之间的语法兼容;例如,在子查询和表函数中使用相关名现在是可选的。

4. 其他数据库产品使用的语法的同义词;例如: 在列函数以及查询的选择列表的上下文中,UNIQUE 是 DISTINCT 的同义词。 MINUS 是 EXCEPT 集合运算符的同义词。

5. 可以使用 序列名.NEXTVAL 和 序列名.CURRVAL 以代替 SQL 标准语法 NEXT VALUE FOR 序列名 和 PREVIOUS VALUE FOR 序列名。

6. 可用于方便地映射程序包变量的全局变量将模拟 @@nested、 @@level 或 @errorlevel 全局变量或者将信息从 DB2 应用程序传递到触发器、函数或过程。

7. ARRAY 集合数据类型可以用于方便地映射到 SQL 过程中的 VARRAY 构造。

8. 提高了标识长度限制,这有助于在 DB2 上启用来自其他 DBMS 供应商的应用程序。

9. 伪列 ROWID 可以用来引用 RID;未受限的 ROWID 引用等同于 RID_BIT() 和受限的 ROWID,例如,EMPLOYEE.ROWID 等同于 RID_BIT(EMPLOYEE)。

10. 通过设置名为 DB2_COMPATIBILITY_VECTOR 的新 DB2 注册表变量,可以有选择地启用更多兼容功能。缺省情况下,这些功能处于禁用状态:

  • 使用 CONNECT BY PRIOR 语法实现分层查询。
  • 使用外连接运算符(+)支持外连接。
  • 将 DATE 数据类型用作 TIMESTAMP(0),即,组合的日期和时间值。
  • 用于支持 NUMBER 数据类型的语法和语义。
  • 用于支持 VARCHAR2 数据类型的语法和语义。
  • 名为 ROWNUM 的伪列是 ROW_NUMBER() OVER() 的同义词,但在 SELECT LIST 和 WHERE 子句中,允许使用 ROWNUM。
  • 名为 DUAL 的哑表提供了类似于 SYSIBM.SYSDUMMY1 的功能。
  • TRUNCATE TABLE 语句的备用语义,在此语义下,IMMEDIATE 是可选关键字,如果未指定此关键字,那么将假定它是缺省关键字。如果 TRUNCATE 语句不是逻辑工作单元中的第一条语句,那么将在执行 TRUNCATE 语句前执行隐式的落实操作。
  • 支持将 CHAR 或 GRAPHIC 数据类型(而不是 VARCHAR 或 VARGRAPHIC 数据类型)赋予字节长度小于或等于 254 的字符和图形字符串常量。
  • 使用集合方法对数组执行操作,例如 first、last、next 和 previous。
  • 支持创建兼容 Oracle 数据字典的视图。
  • 支持编译和执行 PL/SQL 语句和语言元素。
  • 支持使游标对后续语句不敏感(通过在打开时将游标具体化)。
  • 支持过程中的 INOUT 参数,这些参数以缺省值定义,并可在不为其指定自变量的情况下将其调用。

更多兼容特性

1. PL/SQL 代码

不同于 DB2 采用 SQL 标准的 SQL PL 过程语言,Oracle 过程语言是其特有的 PL/SQL 语言,PL/SQL 提供丰富的控制结构、数据类型和函数,有效的帮助开发人员更好的完成应用开发的同时,也将应用锁定在 Oracle 数据库上难以迁移。DB2 从 9.7 开始,在数据库内置 PL/SQL 引擎,对 PL/SQL 提供原生支持。

在 DB2 LUW 9.7以后,PL/SQL 引擎和 DB2 SQL Pl 引擎一样,同样将 PL/SQL 编译成在 DB2 引擎上直接执行的代码。在不同行业、不同国家、不同应用类型、不同应用规模的多种应用中超过 750,000 行 PL/SQL 代码的测试中,超过 90% 的代码能够直接支持而不需要任何修改。

2. Oracle SQL 方言

Oracle SQL 有一些特有的语法DB2原本不支持,DB2 9.7 开始,在兼容模式下,同样能够支持 Oracle 特有的语法。而且,DB2 增强了弱类型的支持,现在能够自动在不同类型中转换,而且,对如下 Oracle 语法有了全面的支持:

  • Truncate Table
  • 自治交易
  • 体系查询(connect by)
  • ROWNUM 伪列
  • 外连接操作符((+))
  • DUAL 伪表
  • select into ... for update语句

3. 并发控制模式

Oracle MVCC 是行业内较为独特的并发控制模式,读操作不会阻塞写操作;DB2 9.7 开始,提供当前提交并发控制模式,读操作碰到正在更新的行时会读取当前提交的数据,和 Oracle MVCC 一样,读操作不会阻塞写操作。

4. 数据类型

DB2 提供对 Oracle SQL 数据类型和 PL/SQL 数据类型的支持。不仅支持 NUMBER,VARCHAR2, DATE, BOOLEAN, BINARY_INTEGER, PLS_INTEGER, RAW,而且支持 Record,collection,VARRAYS 以及 Associative arrays 等 PL/SQL 特有数据类型,以及 CURSOR 类型和 CURSOR 属性。

5. Oracle 特有函数

ASCII,LENGTH,RTRIM,CHR,LOWER,SOUNDEX,CONCAT,LPAD,SUBSTR,CONCAT,||,LTRIM,TRANSLATE,INITCAP,REPLACE,TRIM,INSTR,RPAD,UPPER,CAST,TO_CHAR,TO_TIMESTAMP,TO_NUMBER,CONVERT,TO_DATE,TO_CLOB,ADD_MONTHS,LOCALTIMESTAMP,SYSDATE,CURRENT_DATE,MONTHS_BETWEEN,TO_CHAR,CURRENT_TIMESTAMP,NEXT_DAY,TO_DATE,LAST_DAY,ROUND,TRUNC,ABS,ABS,CEIL,MAX,STDDEV,ACOS,COS,MIN,SUM,ASIN,COSH,MOD,TAN,ATAN,COUNT,LN,SQRT,ATAN2,DENSE_RANK,POWER, TANH,AVG, EXP,RANK,TRUNC,BITAND,EXTRACT, ROUND,VAR_POP,BITANDNOT,FLOOR,SIGN,VAR_SAMP,BITOR,GREATEST,SIN,VARIANCE,BITXOR,LEAST,SINH,SQLCODE,SQLERRM,CARDINALITY, DECODE, NULLIF,COALESCE,LAG,NVL,CURRENT_USER, LEAD,USERENV。

6. 部分 Oracle 特有包

  • DBMS_OUTPUT
  • DBMS_ALERT
  • DBMS_PIPE
  • DBMS_JOB
  • DBMS_LOB
  • DBMS_SQL
  • DBMS_UTILITY
  • UTL_FILE
  • UTL_DIR
  • UTL_MAIL
  • UTL_SMTP

7. SQLPlus 脚本

DB2 9.7 开始,提供 clpplus,能够直接支持 SQL Plus 脚本的执行。

8. Oracle JDBC

Oracle JDBC 驱动程序有一些独特的扩展,比如,Oracle 独特的数据类型支持,为了最大化兼容,减少应用迁移的困难,DB2 JDBC 驱动程序扩展了对 ref cursor 类型和 varray 的支持。

9. Online schema changes

DB2 扩展了标志符最大长度,增强了 Alter Table 语句,增加了 create or replace 语法增强动态数据库 schema 支持,增加了 create with errors 选项,并且提供数据库对象自动重验证。