各位开发人员!您拥有 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 兼容性特性
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 值
我们看一下插入的行:
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中国
作者
相关推荐
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
2017年12月数据库流行度排行榜 定格岁末排名瞬间
数据库知识网站DB-engines最近更新的2017年12月份数据库流行度排名情况是否能提供更多的看点呢?TechTarget数据库网站将与您分享12月份的榜单排名情况,让我们拭目以待。
-
2017年11月数据库流行度排行榜 半数以上数据库积分减少
数据库知识网站DB-engines更新了2016年11月份的数据库流行度排行榜。TechTarget数据库网站将与您一同关注11月份的榜单排名情况。
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。