DB2 10: 在 DB2 10 for Linux, UNIX, and Windows 上运行 Oracle 应用程序

DB2 10 通过 PL/SQL 支持等特性容纳在 Oracle 上开发的应用程序

IBM® DB2® 10 for Linux®, UNIX®为 Oracle 的 SQL 和 PL/SQL 专用语言提供了开箱即用支持。这允许许多根据 Oracle 编写的应用程序在 DB2 上执行,无需进行任何修改。本文高度概述了 Oracle 兼容性在 DB2 中的意义。无论您想将自定义应用程序切换到 DB2,还是想将 DBMS 厂商支持扩展到 DB2,现在就可以行动了。[2012 年 4 月 19 日:本文已更新,包含了 DB2 10 中添加的新特性。]

Serge Rielau, SQL 架构师, IBM

Serge Rielau 致力于 DB2 for Linux、UNIX 和 Window 的 SQL 编译器开发工作已经 12 年了。目前,他是 DB2 for Linux、UNIX 和 Window 的 SQL 架构师。他负责研究 DB2 9.7 上的 SQL 兼容性。可以在 comp.databases.ibm-db2 上找到 Serge。



2012 年 6 月 04 日 (最初于 2009 年 7 月 23 日)

免费下载:IBM® DB2® Express-C 10.1 免费版 或者 DB2® 10.1 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

促成因素

2009 年 3 月,在 Cebit 展会上我进行关于 DB2 的演讲时,烧坏了一个 110V 的计算机扩音器,因为我轻率地将它插在了德国 230V 的电网上,而没使用变压器。还是这次旅行中,类似的事故再次发生,我又弄坏了电动牙刷和剃须刀的充电器。抛开我记性不佳,没有吸取教训不谈,这里似乎应验了我最喜欢的一句谚语(来源不详):“标准的问题就是标准太多”。

在关系数据库管理系统 (RDBMS) 一统天下的世界中,我们幸运地拥有至少三个主要标准和这些标准的无数变体:

  • ANSI SQL 和 ANSI SQL/PSM
  • Oracle SQL 和 PL/SQL
  • Sybase 和 Microsoft® TSQL

图 1 通过韦恩图解阐释了 SQL 专用语言是如何重叠的:

图 1. SQL 的巴比伦的混乱
图片展示了重叠标准的圆圈

无论何时编写应用程序,都必须选择一个 RDBMS 供应商。做完选择后,您基本上就要从一而终了。任何切换供应商期望利用更低价、更优秀技术或更好的合作伙伴关系的尝试都会被在使用另一个 RDBMS 之前需要广泛重写的大量遗留代码所吓退。另外,您的技能集也不会像您预期的一样轻松迁移到另一个产品。

IBM® DB2® 10 for Linux®, UNIX®, and Windows® (DB2) 正致力于寻求一种方式,极大地减少将为 Oracle 编写的应用程序用于 DB2 存在的障碍。这为客户和供应商提供了根据其实际情况而不是应用程序历史选择 DBMS 的能力。

DB2 10 包括 Oracle 兼容性特性

要使为某个 RDBMS 编写的应用程序在不做任何修改情况下运行在另一个 RDBMS 上,很多部分要依序出现。不同的锁机制、数据类型、SQL、服务器上的过程语言、甚至应用程序自身使用的客户机接口都需要保持一致,不仅在语法上而且在语义上。

DB2 中已经采取了所有这些步骤。变化是例外,而不是规则(IBM 可以迅速访问需要的应用程序变更)。表 1 提供了对常用特性的快速概览。

表 1. 常用特性
Oracle-->DB2
并发性控制-->本机支持
SQL 专用语言-->本机支持
PL/SQL-->本机支持
PL/SQL 包-->本机支持
内置包-->本机支持
带有扩展的 JDBC 客户机-->本机支持
OCI 客户端应用程序-->本机支持
Pro*C 应用程序-->本机支持
SQL*Plus 脚本-->本机支持
Oracle Forms-->自动转换到 Java™ 技术
RAC-->pureScale

通过 DB2,就不需要为应用程序确定端口了。只要启用 应用程序即可。在使用打包应用程序的时候,甚至可能为 DB2 和 Oracle 共享一个源。换句话说,在 DB2 中支持 Oracle 应用程序不比使为 HP-UX 编写的 C 程序运行在 AIX 上复杂多少。


并发性控制

过去,Oracle 与 DB2 之间最突出的不同一直是并发性控制方法不同。比较易记的说法是:“读取器不会阻止编写器且编写器不会阻止读取器”。表 2 显示了 Oracle 的并发性行为。

表 2. Oracle 的并发性行为
挂起事务行为新事务
读取器不会阻止读取器
读取器不会阻止编写器
编写器不会阻止读取器
编写器阻止编写器

不用深入到隔离级别,现在足以说明使用 Oracle 默认的语句级隔离 的绝大多数应用程序在使用 DB2 默认的游标稳定性 (Cursor Stability, CS) 时也能很好的工作。

但是,传统上,CS 已经实现了,所以编写器组织读取器并且,在某些情况下,读取器可以阻止编写器。原因是传统上,在 CS 隔离级别下的事务将 “等待挂起的并发事务的变更的结果”。表 3 显示了 CS 并发性行为。

表 3. 传统 DB2 的 CS 并发性行为
挂起事务行为新事务
读取器不会阻止读取器
读取器很少阻止编写器
编写器阻止读取器
编写器阻止编写器

最终发现在 CS 隔离下运行的事务在遇到变更的行时等待结果 不是出于语义原因。另一个比较满意的行为是读取变更行的当前提交 版本。

此行为已经在 DB2 9.7 中实现。具体方法是 DB2 只需从日志中获取锁定行的当前提交版本。在大部分一般情况下,该行仍位于日志缓冲区,因为尚未提交变更。但是只要该行已经编写出来并且 也已经在日志缓冲区中重写,DB2 就能准确知道在哪里找到它,因此单次 IO 就可以将需要的版本带入缓冲区。

如图 2 所示,一个用户更新员工表中的名字。在该用户提交变更之前,另一个用户在浏览这个表。过去,第二个用户不得不等待第一个用户提交或回滚。由于有了读取当前提交数据 特性,第二个用户的浏览操作只需从不包含第一个用户变更的日志缓冲区获取该行的版本即可。

图 2. 编写器不阻止读取器
显示用户 1 更新值,而用户 2 选择表

注意一下这个行为:

  • 没有引入新对象,比如回滚段。
  • 编写日志之后,编写器就没有性能开销了。
  • 不会引起任何类似 “快照过旧” 的情况,因为几乎不可能出现所需的日志文件已经被归档(而事务仍然打开!)在这种情况下,DB2 将会后退并等待锁消失。

除了这些变更,其他避免锁定技术也已经被引入 DB2 了,以便清除在 CS 隔离下持有锁读取器。表 4 显示了 DB2 的新 CS 并发性行为。

表 4. 新 DB2 的 CS 并发性行为
挂起事务行为新事务
读取器不会阻止读取器
读取器不会阻止编写器
编写器不会阻止读取器
编写器阻止编写器

如您所见,DB2 的并发性行为现在与 Oracle 的一样了。事实上,任何自 DB2 9.7 以来创建的 DB2 数据库都会默认表现出这种行为。


新数据类型

每个数据库的核心都是其数据。错配的类型或这些类型错配的语义可能会严重影响在另一个 RDBMS 中支持一个应用程序的能力。因此,要允许 Oracle 应用程序在 DB2 上运行,很重要的一点是要支持其非标准的基本类型,比如字符串、日期和数字。除了调整这些基本类型之外,Oracle PL/SQL 中常用的其他一些更复杂的类型也从 DB2 9.7 开始提供,如表 5 中所示。

表 5. 新 DB2 数据类型
数据类型说明
NUMBER在 DECFLOAT(通过 Power6 硬件加速)和 DECIMAL 基础上添加了对 NUMBER 和 NUMBER(p [, s]) 的支持。
VARCHAR2VARCHAR2-类型的行为包括被解释为 NULL 的空字符串和对结尾空白敏感的纠正。
NCHAR、NVARCHAR2 和 NCLOBNational Character 类型为 Unicode 数据库提供了双字节字符串支持。
Oracle DATEOracle DATE 模式中的数据库除了日历日期还包括 TIME 组件。
TIMESTAMP(n)秒的小数部分的范围可以在 0(日期 + 时间)到 12(微微妙)之间选择。
BOOLEAN此类型可以用在过程逻辑、变量和例程的参数中。
VARRAY过程中的 ARRAY 支持已经扩展到支持 VARRAY 风格的方法和语法。
INDEX BY除了常规数组,DB2 还支持联合数组。
ROW TYPE此复合类型可以用在变量和参数中,并且作为元素用在数组和联合数组中。
Ref Cursor 类型游标可以指定给变量或者使用参数到处传递。

隐式的类型转换和类型解析

“如果走路像鸭子,讲话像鸭子,那么它一定是鸭子。”

这是很多新兴语言,比如 PHP 和 Ruby 的原则。每个字面值都是一个字符串,然后根据上下文用作另一个类型。秉承了 SQL 标准并遵循了类型错配很可能预示着编码错误的原则,DB2 一直遵守着强硬的类型规则,其中字符串和数字不能比较,除非某一个经过显式类型转换,转换成另一个。

不幸地是,Oracle 应用程序在其 SQL 中使用了弱类型,过去该应用程序可能不能在 DB2 上编译。从 DB2 9.7 开始,隐式的类型转换(弱类型)已经成为默认值。也就是,可以以非常灵活的方式比较、赋值和操作字符串和数字。

此外,可以在很多地方使用无类型的 NULL,而且几乎可以在任何地方使用无类型的参数标记,这要多亏了递延准备 功能。也就是说,在发现其第一个实际值之前,DB2 不用再解析参数标记类型。

为了完成隐式类型转换,DB2 还支持默认的例程参数以及通过名称关联 argument 和 parameter。

DB2 中扩展的内置函数库

所有 RDBM 都提供了函数库来操作数据。问题是没有哪两个数据库对这些函数使用同样的名称,尽管最终其功能都非常类似。

除了其自己传统的函数集,DB2 现在支持与 Oracle 兼容的库。以下列表提供了快速概览,当然不可能是全部的:

  • 转换和类型转换函数
    • TO_DATE
    • TO_CHAR
    • TO_CLOB
    • TO_NUMBER
    • TO_SINGLE_BYTE
    • TO_TIMESTAMP

    这些函数中的每一个都支持丰富的兼容格式字符串集。

  • 日期算法
    • EXTRACT
    • ADD_MONTHS
    • MONTHS_BETWEEN
    • NEXT_DAY
    • 加号 (+) 添加天的分数
  • 字符串操作
    • LPAD
    • RPAD
    • INSTR
    • INITCAP
    • LISTAGG
    • SUBSTRB
    • SUBSTR2
    • SUBSTR 扩展
  • 其他
    • NVL
    • NVL2
    • HEXTORAW
    • DECODE
    • LEAST
    • GREATEST
    • BITAND
    • RATIO_TO_REPORT

两种产品间支持函数的重合部分不断增加表明在 DB2 上对 Oracle 应用程序开箱即用的支持得到了极大改进。


Oracle SQL 专用语言支持

到目前为止,本文介绍了并发性、数据类型、类型规则和函数。但是 Oracle 和 DB2 之间的不同不止于此。SQL 专用语言的框架、其关键字和语义在某些方面是不同的。而且每个产品都会有一些特性是另一个不支持的。在这些特性流行时,它们限制了为两种产品提供通用 SQL 的能力,从而可以改善大大小小的语言缺点。表 6 列举了一些重点。

表 6. 新的 SQL 支持
特性说明
CONNECT BY 递归到目前为止,DB2 已经支持 ANSI SQL 递归了。现在,已经可以添加 Oracle-样式的 CONNECT BY 了,包括各种函数和伪列,比如 LEVEL 和 CONNECT_BY_PATH。
(+) 连接语法这种语法实际上甚至连 Oracle 都不提倡了,但是有很多应用程序和开发人员仍在使用这种形式的 OUTER JOIN 语法。
DUAL单行、单列表在 Oracle 应用程序中被广泛地用作哑表。
ROWNUM 伪列该伪列通常用于限制返回的行数并在结果集中枚举行。
ROWID 伪列Rowid 用于快速检索之前根据其物理地址获取的行。
MINUS SQL 操作符在 Oracle 中,用 MINUS 而不是 EXCEPT 从另一个结果集中减去一个结果集。
SELECT INTO FOR UPDATEFOR UPDATE 构建在 SELECT INTO 上,允许从 DB2 中抽取一行,以便稍后在不使用游标的情况下修改它。
PUBLIC SYNONYM公共同义字是一个没有模式名的别名。DB2 支持表对象、序列和 PL/SQL 包的公共同义字。
CREATE TEMPORARY TABLE除了声明全局临时表之外,DB2 还支持创建全局临时表。
TRUNCATE 表语句此语句无需激活触发器即可快速删除整个表的内容。
CREATE OR REPLACE 对象语句该符号可以让你替换新版本中已存在的对象。
命名参数(=>)您可以通过使用 => 符号,按名称将参数关联起来,从而调用过程和函数,而不是依赖于位置关联。
不严格的名称解析DB2 不再需要命名内联视图。另外,可以更轻松地从集合操作符(比如 UNION)继承列名称。

到这里,对 DB2 变化的概述就结束了,这是因为有了这些变化,向 DB2 数据库提交 SQL 的 Oracle 应用程序才能保持几乎不变的运行。但是,有很多应用程序的主要部分在服务器自身上执行。Oracle 应用程序服务器端的语言选择是 PL/SQL。没有对 PL/SQL 的支持,就不要声称可以提供兼容性。


DB2 对 PL/SQL 的支持

通常,应用程序从一个产品定位到另一个产品时,SQL 和过程语言也从一种 SQL 专用语言转换成另一种。这会造成几个问题:

  • 由于源和目标语言之间自动的不顺畅的错配导致得到的转换后代码让人费解。
  • 应用程序开发人员不熟悉目标 SQL 专用语言。这使得调试转换后的代码很困难。随着时间推移,由于缺乏技能,后续维护会成为一个难题。
  • 在处理打包应用程序时,需要为该应用程序的每个新版本重复转换。
  • 最后,结果只是类似,从理论上说,它要比原始程序运行得慢一些。

为了避免这些问题,DB2 包含了本机 PL/SQL 支持。这意味着什么呢?

如您在图 3 中看到的,DB2 引擎包括一个 PL/SQL 编译器以及一个 SQL PL 编译器。这两个编译器为 DB2 的 SQL Unified Runtime Engine 生成虚拟机代码。很重要的一点是要注意到监控和开发工具,比如 Optim Development Studio,是在运行时引擎级别被挂靠到 DB2 的。

图 3. PL/SQL 编译器支持
Optim Development Studio 中的 PL/SQL 编译器支持

将 PL/SQL 作为一类过程语言集成到 DB2 中有以下几个影响:

  • 没有转换。源码在模式目录中保持原样。
  • 开发人员可以继续使用熟悉的语言工作。无需将逻辑移动到 DB2 的专用语言,即使新逻辑是用 SQL PL 编写的。使用不同语言的例程可以彼此调用。
  • 打包应用程序供应商可以针对 Oracle 和 DB2 使用一个源代码。
  • PL/SQL 和 SQL PL 都为 DB2 的 SQL Unified Runtime Engine 生成同样的虚拟机代码。因此,在设计上,PL/SQL 和 SQL PL 执行的速度一样。
  • 因为调试器基础架构直接挂钩在 SQL Unified Runtime Engine 中,所以 PL/SQL 很自然地得到 Optim Development Studio 的支持。

图 4 显示了一个 PL/SQL 调试会话。该调试器支持标准特性,比如跳入、跳过和断点。此外,它允许用户在程序运行时,改变局部 PL/SQL 变量。

图 4. DB2 中支持的 PL/SQL 调试器
显示带有调试面板、变量面板和查询面板的屏幕

PL/SQL 语法细则

那么,PL/SQL 支持究竟意味着什么呢?首先,有一个核心语法支持。DB2 支持所有 PL/SQL 的通用构造,比如:

  • if then else
  • while 循环
  • := 赋值
  • 局部变量和常量
  • #PRAGMA EXCEPTION 和异常处理
  • 各种形式的 for 循环(范围、游标和查询)
  • %TYPE%ROWTYPE 将变量和参数锚定到其他对象
  • 可以在将在这个块中使用的任何 PL/SQL 块中声明局部类型。
  • 可以在将在相同块中调用的 PL/SQL 块中声明局部过程。
  • #PRAGMA AUTONOMOUS 事务,允许在私有事务中执行过程。
  • CCFLAGS 条件编译允许根据上下文编译不同片段的 PL/SQL。该特性对于尽量减少共享 PL/SQL 代码库中的 DB2 相关代码尤其有用。
  • 供应商能通过打包 PL/SQL 对象,例如使用 DBMS_DDL.WRAP BMS_DDL.CREATE_WRAPPED 函数的包主体,来混合 PL/SQL 中珍贵的知识产权。

PL/SQL 对象支持

PL/SQL 可以用在各种不同的支持过程逻辑的对象中。

  • 标量函数包括对以下方面的支持:
    • INOUTOUT 函数参数
    • 使用命名参数关联的调用
    • 参数默认
    • 运行时 “纯度” 强制
  • 在每行或每个语句多动作触发器之前
  • 在每行或每个语句多动作触发器之后
  • 过程包括对以下方面的支持:
    • INOUTOUT 过程参数
    • 使用命名参数关联的调用。
    • 参数默认。
  • 匿名块。
  • PL/SQL 包。

PL/SQL 包支持

Oracle 应用程序中的大部分 PL/SQL 都包含在所谓的 中。PL/SQL 包(不要与 DB2 包弄混)是单个对象的集合,能够区分那些外部可访问的对象和哪些仅用于包内部的帮助函数。包的 ANSI SQL 等价物是模块。DB2 现在支持 ANSI SQL 模块以及 PL/SQL 包。特别是,提供了以下功能:

  • CREATE [OR REPLACE] PACKAGE,定义外部访问例程的原型。它还定义了所有外部可访问的、非过程对象,比如变量和类型。
  • CREATE [OR REPLACE] PACKAGE BODY,它实现了所有私有和公共例程以及所有其他私有对象。
  • 在包或包体内部,可以定义以下对象:
    • 变量和常量
    • 数据类型
    • 异常
    • 标量函数
    • 过程
    • 游标
  • 包初始化
  • 包的公共同义字

DB2 提供了通用内置包

某些 Oracle 应用程序利用 RDBMS 提供的包。特别是,提供报告、电子邮件或交叉连接通信的库非常流行。为了便于 DB2 支持这些应用程序,DB2 提供了表 7 中列出的包:

表 7. DB2 提供的内置包
说明
DBMS_OUTPUT提供基本报告功能,可以通过命令行开关。
UTL_FILE允许处理 DB2 服务器上的文件的模块。
DBMS_SQL除了现有 EXECUTEEXECUTE IMMEDIATE 语句,该包提供了用于执行动态 SQL 的 SQL API。
UTL_MAIL该模块允许从 SQL 发送电子邮件通知。
UTL_SMTP低级别的 API,类似于提供 SMTP 集成的 UTL_MAIL。
DBMS_ALERT该包使用时允许不同的会话之间彼此发信号。
DBMS_PIPE该模块允许会话彼此发送数据。
DBMS_JOB提供与 DB2 的任务调度器集成的可兼容 API。
DBMS_LOBOracle API,用于 LOB 处理,回应 DB2 的内置 LOB 函数。
DBMS_UTILITY应用程序中使用的各种过程的集合。
DBMS_DDL用来搞混 PL/SQL 对象以保护供应商 IP 的函数。

Oracle Application Enablement to DB2 for LUW 维基 中海油更多可用的包。在这里,您还可以找到各种其他的提示和技巧,以及背景知识。


特定于 Oracle 的 JDBC 扩展

JDBC 是标准 Java 客户机接口。但是为了支持特定的非标准数据类型,已经向 Oracle 的 JDBC 驱动程序中添加了扩展。

为了将与基于 Java 技术的应用程序兼容性发挥到最大,除了其他支持以外,DB2 JDBC 驱动还支持使用引用游标 VARRAYROW 参数来调用过程。


OCI 应用程序支持

很多较老的 Oracle C 应用程序使用 Oracle Client Interface (OCI) 与 DBMS 进行通信。从 DB2 9.7 开始,提供了兼容 OCI 的客户端,称为 DB2CI,它还支持超过 150 个兼容 OCI 的函数,从 OCIAttrGetOCITransRollback。有了 Fix Pack 2,甚至还可以使用 OCI7 API。很多情况下,可以简单地将 OCI 应用程序重新连接到 DB2CI 库,从而可以让 OCI 应用程序正常工作,而 DB2 几乎不作任何改变。

  1. 只要创建以下的名为 oci.h 的包含文件:
    #include <db2ci.h>。
  2. 确保在 PATH 中 oci.h 在 Oracle 的 oci.h 之前。
  3. 然后在 makefile 中用 -ldb2ci.dll 替换 -loci.dll 连接选项,并重新编译应用程序。

使用 CLPPlus 的 SQL*Plus 脚本支持

很多时候,DDL 脚本甚至报告都是使用 SQL*Plus 命令行处理器编写的。要使迁移这些脚本以及编写它们的开发人员的技能更加容易,DB2 提供了兼容 SQL*Plus 的命令行处理器,叫做 CLPPlus,如图 5 中所示。

图 5. 兼容 SQL*Plus 的 CLPLus 工具
显示 CLPPlus 工具的命令行中输入命令

该工具提供了以下功能:

  • 兼容 SQL*Plus 的命令选项
  • 变量替换
  • 列格式化
  • 报告功能
  • 控制变量

启用 Oracle Forms

Oracle Forms 是一款旧版软件产品,用于创建数据库的数据输入系统。有些客户和 ISV 拥有数百个 Oracle Forms 屏幕,这些屏幕都是应用程序的组成部分。IBM 已经和 LLC 公司及 WonderWorks Group 开展合作,提供从 Oracle Forms 到 Java 的无缝转换功能。

双方均提供了以高度自动化、高效且可维护方式将 Oracle Forms 转换成 Java 语言的一种工具,同时保持了原有的 Forms GUI 外观,并且不会新增加对第三方产品的依赖。

WonderWorks FusionPaaS 可以将典型的 Oracle Fusion Forms 应用程序(如图 6 中所示)转换成 J2EE 应用程序(如图 7 中所示),它完全支持 Web,例如可以在 iPad 或其他智能设备上运行,还可以集成到 Web 2.0 应用程序,如 Google Maps 中。

图 6. 原始的 Oracle Fusion Forms
显示一个 Oracle Fusion Forms 应用程序
图 7. 使用 FusionPaaS 转换格式
显示经过 FusionPaaS 转换后的 Oracle Fusion Forms 应用程序

关于 WonderWorks FusionPaaS 的更多信息,请参阅 Oracle Application Enablement to DB2 for LUW 维基上的白皮书。


不断细化

随着越来越多的客户和合作伙伴使用 DB2,在 DB2 Fix Pack 流中引进了特性请求和细化,以不断提升兼容性。

DB2 9.7 Fix Pack 1

Fix Pack 1 引进了以下功能:

  • CCFLAGS 支持使供应商应用程序的 Oracle 和 DB2 之间的共享代码数量达到最大值。
  • FORALLBULK COLLECT 支持。
  • 针对 Boolean 表达式处理的增强。
  • 兼容 OCI 应用程序的 DB2CI 客户端。
  • 各个类型的 CREATE OR REPLACE
  • PL/SQL 函数的扩展支持,例如 INOUT 参数,可从函数写入表的功能,等等。
  • 与发布版结合使用,启用了 Oracle Forms 应用程序。

DB2 9.7 Fix Pack 2

Fix Pack 2 引进了以下功能:

  • NCHARNVARCHAR2NCLOB 支持,以及各种 NCHAR 函数,如 TO_NCHARTO_NCLOB
  • 使用 DBMS_DDL.WRAPDBMS_DDL.CREATE_WRAPPED 函数的 PL/SQL 代码混合。
  • 函数中的命名参数调用和 DEFAULT。
  • 过程中非结尾的 DEFAULT
  • BULK COLLECT 性能增强。

DB2 9.7 Fix Pack 3

Fix Pack 3 引进了以下功能:

  • 对小型 LOB 进行比较,以突破页面大小限制的功能。
  • NUMBER 性能增强。
  • RATIO_TO_REPORT 函数。
  • RAISE_APPLICATION_ERROR 的改进。
  • 运行时 “纯度级别” 强制。

DB2 9.7 Fix Pack 4

Fix Pack 4 引入了以下功能:

  • ROWARRAY OF ROW 提供的 JDBC 支持。
  • 多动作触发器支持。
  • 对更新数据库的 BEFORE 触发器的支持。
  • LIKE 的支持,没有固定的模式。
  • LISTAGG 字符串聚合的支持。
  • 对自治事务支持的改善。

DB2 9.7 Fix Pack 5

Fix Pack 5 引进了以下功能:

  • 嵌套的 ROWARRAY 提供 JDBC 支持。
  • 为 PL/SQL 提供嵌入式 ROWARRAY 支持。
  • 新的 NVL2SUBSTR2HEXTORAW 函数。
  • ROWARRAY 类型中的 BOOLEAN 提供支持。
  • 对自治事务支持的改进。
  • Pro*C 支持。
  • SQL 比较带有 VARCHAR2 值的 CHAR 列的性能提升。

DB2 10.1

DB2 10.1 引进了以下功能:

  • 为大量使用逻辑的 SQL PL 和 PL/SQL 提供极大提升的性能。
  • 支持针对 PL/SQL 块进行局部类型声明。
  • 支持针对 PL/SQL 块进行局部过程声明。
  • 语句级别 PL/SQL 触发器
  • 行和列级别的访问控制 (RCAC) 使得映射 FGAC 变得很容易。

后续的 Fix Packs 和即将发行的 DB2 主要版本预计将提供更高级别的兼容性。


在 DB2 中使用就像拖放操作那么简单

既然 DB2 已经对 PL/SQL 进行了调整,使其尽可能与 Oracle SQL 保持一致,现在就无需使用复杂的迁移工具包了。只需使用 IBM Data Movement Tool,即可轻松地将表、包或整个模式从 Oracle 中拖放到 DB2 中。在发生异常情况的时候,仅需要做少量的修改,即可将应用程序移动到 DB2,或者对应用程序进行修改,这样就可以在 DB2 和 Oracle 上操作相同的来源。

步骤可简单到只需如下操作:

  1. 设置必要的注册表变量:
    • db2set DB2_COMPATIBILITY_VECTOR=ORA
    • db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
  2. 重启数据库管理器:
    • db2stop
    • db2start
  3. 创建兼容 Oracle 的数据库:
    • db2 create database mydb pagesize 32 K
    • db2 update db cfg for mydb using auto_reval deferred_force
  4. 启动 IBM Data Movement Tool,并连接到 Oracle 和 DB2 数据库(如图 8 中所示):
    图 8. 使用 IBM Data Movement Tool 拖放 Oracle 模式到 DB2
    屏幕截图显示连接到 Oracle、连接到解压 DDL/ 数据并生成迁移脚本,然后在执行 DB2 脚本时部署 DDL/ 数据
    连接后,就可以选择只提取 DDL 或同时提取 DDL 和数据。最后,有两个选择:通过执行生成的脚本直接部署或继续使用交互部署 面板。建议将后者用于大型应用程序。
  5. 使用交互部署 将所需的模式从 Oracle 移动到 DB2,如图 9 中所示。
    图 9. 使用 IBM Data Movement Tool 拖放 Oracle 模式到 DB2
    屏幕截图显示您拖放 Oracle 模式的面板
    交互部署 模式中,您会看到一个导航树,它显示了所有从 Oracle 数据库中提取的对象。选择所有对象并执行部署菜单选项。该工具将复制这些对象到 DB2 并记录其进度。可能不能成功部署某些对象,但是该工具会为您提供选项来处理这些对象。选择对象时,您会看到 DDL 以及 DB2 遇到的错误。现在可以按需修复定义并重新部署。目标是在发生异常情况时交互式地将所有对象移动到 DB2。

评估 DB2 的启用

那么在 DB2 9.7 中使用您的应用程序究竟有多容易呢?答案是要视情况而定。IBM 有一个称为 MEET DB2 的可供下载的工具。此工具可以分析 Oracle 数据库中的所有对象并进行评分。它会生成一个报告,其中列出哪些地方可以开箱即用,哪些地方需要进行调整。要快速了解此概念,您可以 下载 MEET DB2 并亲自试用它。如果您愿意,还可以通过 askdata@ca.ibm.com 与 IBM 团队取得联系,他们可以为您当前的 Oracle 数据库提供快速的兼容性评估。

图 10 显示了 MEET DB2 工具输出的示例。

图 10. MEET DB2 报告工具执行评估
显示 96.8% 的语句立即转换至 DB2

在示例报告中,该工具表明,98% 的 PL/SQL 语句都可以立即转换至 DB2。它还会根据对象类型分解语句,并显示每种对象类型在迁移过程中需要关注的程度。

从 DB2 9.7 开始,对数百种应用程序(总计数百万行 PL/SQL 代码) 进行了详细分析,平均开箱即用迁移率达 90%-100%。

图 11 显示了 Fix Pack 4 运行时的统计数据。

图 11. 支持语句的平均迁移率高达 98% 以上
图片显示了支持语句的平均率

38 个随机样板应用程序产生了 200 万行代码,83% 到 99.9% 的代码可立即转换至 DB2。


架构

DB2 的应用程序转换方法与传统的转换完全不同。大多数供应商均提供了通过手动协助将源语言离线转换 至目标语言的工具。其结果是获得了一些非常令人费解、难以维护的代码。几乎没有供应商添加那些可以在目标语言中动态模拟 源语言的中间层。当然,设计模拟非常慢,尤其在试图实现正确语义的时候。

对于 DB2,兼容性是深入引擎各层中,由他们来处理语义和语法。DB2 已突破周期的限制,扩展到能支持必要的特性了。图 12 中的架构图突出显示了因支持 Oracle SQL 和 PL/SQL 专用语言而发生重大变化的 DB2 区域。

图 12. DB2 编译器和运行时引擎的架构
图片显示 DB2 编译器和运行时引擎

SQL 编译器中的 SQL 解析器部分和重写部分、PL 编译器中的 PL/SQL 解析器、PL 运行时和 SQL 运行时已经进行大量的扩展或添加了新的内容,以适应 Oracle 专用语言。


常见问题解答

此项技术是否已经准备用于关键应用程序?

美国最大的银行之一已经将其在线银行系统委托给此项技术。如果您立即检查您的美国银行帐户,那么很可能会推动 DB2 上的 PL/SQL 包的执行。

DB2 10 支持哪个版本的 Oracle?

为 SQL 和 PL/SQL 专用语言提供的范围严格基于应用程序正在使用的版本。支持最新的 Oracle 11g 中引入的某些特性,但是不支持 Oracle 8i 中使用的某些构造。在一个涉及 38 个应用程序总共 2,048,941 行代码的研究中,83%-99.9% 的代码被原封不动的移动到了 DB2 9.7.4 中。而其他代码的调整已经可以在 DB2 10 中自动进行处理或者是重复的。

Oracle 应用程序在 DB2 上的运行速度如何?

这个问题很难回答!很遗憾,Oracle 许可条款中禁止任何人未经预先书面同意公布基准测试结果。凭借其特别设计,并经过质量保证基准测试的确认,在 DB2 上用 PL/SQL 编写的应用程序与在 DB2 上用 SQL PL 编写的应用程序运行速度一样快。使用过这种支持过程的供应商基本上都感到惊喜。

提供这些特性需要进行多少工作?

不像大家想象的那么多。我们已经以战略方式为 DB2 9.5 完成了一些初始工作,比如 CONNECT BYNUMBER。坦率地讲,DB2 9.7 中的这些工作会在 18 个月之内完成。从那开始,我们不断根据客户的要求逐渐提高兼容性。

支持从 Oracle 到 DB2 有哪些常见难题?

DB2 的兼容性显然不是 100%,所以第一次在 DB2 上使用 Oracle 应用程序时可能有些小问题。但是,这些问题很多都是无足轻重的而且容易修复。例如,DB2 不支持 PIPELINED 函数。因此需要用变量赋值来替换 PIPE 语句以填充函数结果。

哪些版本的 DB2 支持 Oracle SQL 兼容特性?

DB2 for Linux, UNIX, and Windows 支持的所有平台都支持上述的特性,包括 Windows、Linux(Intel、Power 和大型机)、HP 和 Sun Solaris。DB2 for LUW 支持所有版本的 DB2。在使用 DPF 中的 PL/SQL 函数和触发器时,有一些技术限制。

DB2 Express-C 是否支持 PL/SQL?

当然!您可以通过转移到 DB2 9.7.5 Express C 或 DB2 10 Express C 来解除 Oracle XE 数据库大小限制。最妙的是:可以在云上使用(参阅 参考资料 部分)。

最难实现的特性是什么?

目前为止,VARCHAR2 语义是最难实现的。“尾随空格的问题” 语义和 “NULL 是空字符串” 仍然是一个挑战。


结束语

借其本机多专用语言 SQL 支持,DB2 允许在 DB2 上轻松地使用 Oracle 应用程序。打包应用程序厂商可以以最少的成本提供既可用于 Oracle 又可用于 DB2 的应用程序。用户可以自由选择提供其所需技术的供应商,无需受到以前的限制。

要测试这些特性,可以下载 DB2 10 的试用版(参阅 参考资料 部分)。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=787712
ArticleTitle=DB2 10: 在 DB2 10 for Linux, UNIX, and Windows 上运行 Oracle 应用程序
publish-date=06042012