DB2 9.7 中的 SQL 兼容性

日期: 2010-01-03 作者:Anil Mahadev 来源:TechTarget中国 英文

  各位开发人员!您拥有 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 兼容性特性

  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 值

  我们看一下插入的行:

  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。您绝不会失望的!

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐