内容


DB2 9.7 中的 SQL 兼容性

从触发器到对象改进:演示新的 Oracle 兼容性特性

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分:

敬请期待该系列的后续内容。

此内容是该系列的一部分:

敬请期待该系列的后续内容。

各位开发人员!您拥有 Oracle 数据库技能吗?希望在另一种数据库平台上重用 PL/SQL 知识和代码吗?

IBM DB2 for Linux, UNIX, and Windows (LUW) 已经完成了一项重大的改造。由于客户一直要求提供节省成本的改进,最新版本 DB2 9.7 在大家熟悉的领域提供了许多新技术,比如自治(自我管理)和深度压缩(见本期杂志中的 “DB2 9.7:全面改进”)。但是,开发人员最感兴趣的是与 SQL 兼容性相关的功能。这些特性让客户更容易采用 DB2 作为数据库软件,从而利用它的节省成本和高性能特性。即使客户目前最熟悉其他数据库系统,也很容易掌握 DB2。

在本文中,我将通过示例演示 DB2 9.7 中新的 SQL 兼容特性。首先讨论触发器和新的数据类型,然后谈谈对 Oracle SQL 和 PL/SQL 的支持,最后讨论对象和并发改进。这样所有开发人员都应该相信 DB2 是 “兼容的”。

首先,连接 Command Line Processor Plus (CLP Plus) 窗口(见图 1),把 “db2admin” 替换为您选择的登录 ID:
clpplus db2admin@localhost:50000/sample

SQL 兼容性

使用 DB2 9.7 中新的 SQL 兼容性特性的第一步是启用 DB2_COMPATIBILITY_VECTOR 参数。设置 db2set DB2_COMPATIBILITY_VECTOR=ORA,即可为后续的所有数据库创建操作启用与 Oracle 相关的 SQL 兼容性特性。对 DB2_COMPATIBILITY_VECTOR 使用的一些最重要的参数的解释见表 1。

要启用这个特性,您必须具有管理特权。在 DB2 命令窗口中输入以下命令:

db2set DB2_COMPATIBILITY_VECTOR=ORA
db2stop
db2start

要创建一个简单的数据库,输入:db2 create database [dbname]。然后,可以输入以下命令连接数据库:
db2 connect to [dbname];

下一步是创建使用 Oracle 数据类型的表。在 CLP Plus 窗口或 IBM Data Studio 中输入下面的 CREATE TABLE 语句:
Create table employee (EMPNO NUMBER(5), ENAME VARCHAR2(50), DEPTNO NUMBER(5))

图 1: 在 DB2 9.7 中,可以通过 CLP Plus 界面体验 SQL 兼容性特性
图 1: 在 DB2 9.7 中,可以通过 CLP Plus 界面体验 SQL 兼容性特性
图 1: 在 DB2 9.7 中,可以通过 CLP Plus 界面体验 SQL 兼容性特性

PL/SQL 特性

现在讨论支持创建 PL/SQL 过程的特性。DB2 9.7 支持:

  • 用户定义的包
  • PL/SQL 过程/函数/匿名块
  • 内置的包(DBMS_OUT.PUT_LINE、DBMS_PIPE、DBMS_UTL 等)
  • 关联 (INDEX BY) 数组
  • Varrays
  • 触发器
  • %ROWTYPE
  • %TYPE
  • EXCEPTIONS
  • Ref-Cursors

注意,只有 DB2 9.7 for LUW 的 Enterprise Server Edition 和 Workgroup Edition 提供 PL/SQL 支持。在 DB2 Express-C、DB2 Express 和 DB2 Personal Edition 中不支持 PL/SQL。

DB2 中的 PL/SQL 过程

DB2 支持 PL/SQL 语言的许多语法。我们通过一些示例代码看看效果。在编译和执行时,下面的 PL/SQL 过程向用户显示一条欢迎消息。为了在控制台上看到输出,先要执行 SET SERVEROUTPUT ON 命令。

CREATE OR REPLACE PROCEDURE message_proc (myname varchar2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Welcome to DB2 9.7 ( )! ' || myname
|| '. Now supports for ORACLE SQL and PL /SQL as well :-)!');
END message_proc;

执行以下命令在 DB2 中调用这个 PL/SQL 过程:

EXEC proc_name
EXEC message_proc('Anil');

下面是一个使用 FOR 循环的示例:

BEGIN
FOR a IN 10 .. 20 LOOP
DBMS_OUTPUT.PUT_LINE('Counter ' || a);
END LOOP;
END;

这个循环产生以下输出:

Counter 10
Counter 20

truncate table 命令

有 Oracle 数据库背景的开发人员很可能使用过 TRUNCATE TABLE 命令。DB2 现在也支持这个命令。下面的代码创建一个简单的表,在其中添加行,然后使用 TRUNCATE 命令删除表中的所有行:

CREATE TABLE CLIENTS
(CLIENTID NUMBER(5) PRIMARY KEY NOT NULL,CLIENTNAME
VARCHAR2(50));

插入一些行:

INSERT INTO CLIENTS (CLIENTID, CLIENTNAME) VALUES (1,'IBM');
INSERT INTO CLIENTS VALUES (2,'MSFT');
INSERT INTO CLIENTS VALUES (3,'EDB');

表 1: DB2_COMPATIBILITY_VECTOR 值
表 1: DB2_COMPATIBILITY_VECTOR 值
表 1: DB2_COMPATIBILITY_VECTOR 值

我们看一下插入的行:

SELECT * FROM CLIENTS;

现在,执行以下命令删除这些行:

TRUNCATE TABLE CLIENTS;

现在确认这些行是否已经消失了:

SELECT * FROM CLIENTS;

输出中应该不会显示任何行。

对象和并发改进

最后,我要讨论 DB2 9.7 中两个重要的改进,它们可以节省时间和提高性能:初次使用检验(first-use validation)和新的默认锁状态。

初次使用检验
如果修改了底层数据库对象(表、视图、过程、函数等等),那么在依赖它的对象下一次获取它时,会自动地重新检验它。这肯定会节省应用程序开发人员的时间。每当修改对象时,都会执行自动的依赖性检查。

Read currently committed(DB2 中的默认锁状态)
在以前的 DB2 版本中,不可能出现一个用户读取一行,而同时另一个用户写同一行的情况。这是因为读者要等待写操作的结果。现在,DB2 9.7 使用的默认锁状态允许读者不等待写操作的结果。相反,它们会读取这一行的当前已经提交的版本。因此,读者不会阻塞写者,写者也不会阻塞读者。

这些新的 SQL 兼容性特性给我留下了非常深刻的印象。本文只能涉及这些特性的皮毛,请您自己试试 DB2 9.7。您绝不会失望的!


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=418362
ArticleTitle=DB2 9.7 中的 SQL 兼容性
publish-date=08052009