开始之前
本教程的内容
本教程介绍了不同类型的数据库对象和编程方法。在本教程中,我们将学习:
不同类型的数据库对象
模式与数据库对象之间的关系
SQL 例程的基本原理
编程接口的基础知识:动态 SQL、静态嵌入式 SQL、CLI 和 ODBC、.NET、JDBC 和 SQLJ、PHP、Perl、Python 以及 XML
应用程序数据访问相关的安全考虑
这是包含九篇教程的系列文章的第一篇,此系列用于为 DB2 9 Family Application Development 认证考试 (Exam 733) 作准备。本教程的内容主要涵盖了该考试第 1 部分的考察目标,标题为:“数据库对象和编程方法。”
学习本教程不一定要拥有一份 DB2 9。
哪些人应学习本教程?
要参加 DB2 9 Family Application Development 考试,必须已通过 DB2 9 Family Fundamentals 考试 (Exam 730)。可以使用 “DB2 Family Fundamentals 教程系列” 为后一考试作准备。该系列教程很受欢迎,已帮助许多人了解 DB2 系列产品的基本原理。
虽然要理解本教程描述的概念,不必完全掌握 Family Fundamentals 系列教程中讨论的所有内容,但应至少具备以下几个方面的基础知识:
DB2 实例
数据库
数据库对象
DB2 安全
本教程是可以帮助您为 Exam 733 作准备的方式之一。
DB2 数据库对象
基本数据库对象
数据库对象是构建数据库的原料。DB2 提供了不同类型的数据库对象,用于存储和表示不同的信息。可使用数据库定义语言 (DDL) 创建、修改和删除这些对象。要操作这些对象,请使用数据库操作语言 (DML),该语言包含 SELECT、UPDATE、INSERT 和 SELECT 语句。一些常用的数据库对象如下:
表
自定义数据类型
约束
视图
索引
如果您对这些基本的数据库对象不太熟悉,请查阅标题为 “使用 DB2 对象”(developerWorks,2006 年 7 月)的 Family Fundamentals 教程,了解背景信息。
除 Family Fundamentals 教程中介绍的数据库对象以外,还有一些其他对象,在开发 DB2 应用程序时比较有用。本教程将在此部分介绍这些对象。
在继续学习之前需要注意一点:在本文提供的示例中,对象名称以小写字母表示。不论 DB2 在何种平台上运行,它总是以大写形式存储名称,除非标识符的名称加了双引号 ("")。
例如,下列语句将创建一个表 employee(小写),它与表 EMPLOYEE(大写)具有相同的列定义。
CREATE TABLE "employee" LIKE employee
别名
别名 是现有表、视图或昵称的备用名。别名还可作为其他别名的备用名。与对象类似,可创建或删除别名,别名可拥有相关的注释。以下是几个 CREATE ALIAS 语句示例:
CREATE ALIAS aliastab1 FOR tab1;
CREATE ALIAS bob.aliastab1 FOR tom.tab1;
CREATE SYNONYM bob.aliastab2 FOR bob.aliastab1;
如您所见,CREATE ALIAS 语句非常简单。可使用与源对象相同的模式创建别名(如第一行所示),也可完全限定别名名称(如第二行所示)。用关键字 SYNONYM 替代 ALIAS(如第三行所示)也有效,这样做是为了与 DB2 for zSeries 兼容。
使用别名不需要具备特殊权限。但是,需要获得引用的底层对象相关的适当授权。要获得数据库对象权限的完整列表,请查阅标题为 “服务器管理”(developerWorks,2006 年 6月)的 DB2 DBA 认证教程。
前面提到可以为昵称 创建别名。昵称是引用联合系统上数据表或视图的数据库对象。但是,联合数据库支持超出了本教程的讨论范围。
要给别名添加注释,可使用以下语句:
COMMENT ON aliastab1 IS 'My first alias on tab1'
要删除别名,可以与删除任何其他数据库对象一样,使用 DROP 语句:
DROP ALIAS aliastab1
序列对象
序列 是允许自动生成值的数据库对象。与绑定到特定表的标识列不同,序列是全局的、独立的对象,可被同一数据库中的任何表使用。
标识列是一种特殊类型的序列对象。因此,标识列的特征也适用于序列对象。下面是 CREATE SEQUENCE 语句示例:
清单 1. CREATE SEQUENCE 语句
CREATE SEQUENCE myseq AS INTEGER
START WITH 360
INCREMENT BY 10
NO MAXVALUE
CYCLE
CACHE 20
任何数值范围包含零值的整数数据类型都可用作序列值。这些类型包括 SMALLINT、INTEGER、BIGINT 或 DECIMAL。基于这些数据类型的自定义特殊类型也都可用作序列值。这进一步扩展了自定义特殊类型在应用程序中的应用。
如上面的清单 1 所示,可以通过指定序列的初始值来定制序列对象。在本例中,序列的初始值为 360。后续值的生成由 INCREMENT BY 子句控制。支持使用正、负常量生成升序、降序序列值。
默认情况下,序列生成的最小值和最大值受序列数据类型限制的约束。例如,INTEGER 序列值必须介于 -2,147,483,647 到 2,147,483,647 的范围之内。可在 DB2 SQL 参考指南(参见 参考资料)中找到所有数值数据类型的限制。要更改这种约束行为,可使用 MINVALUE 和 MAXVALUE 选项为生成的值设定界限。如果达到最小或最大值,则可使用另一个称作 CYCLE 或 NO CYCLE 的选项来指定序列值是否可循环。请注意:当 CYCLE 生效时,该序列可能生成重复的值。
CACHE 选项允许 DB2 在内存中保存一些预分配的值以改善性能。CACHE 20 是默认行为。关于此选项需要注意一点:如果 DB2 在停止时没有用完所有缓存的值,则所有未使用的缓存值将被丢弃。DB2 重新启动后,就会生成并缓存下一组值,导致产生值差异。如果您的应用程序不允许存在值差异,可考虑改为使用 NOCACHE 选项。
如果未使用缓存,若序列的数字生成速度很快,性能就会非常糟糕。每生成一个新值时就会写一个日志记录。因此,在一个请求中获取值并将其缓存在内存中,效率更高。
可使用 ALTER SEQUENCE 语句更改序列对象的特征。可以更改上面讨论的所有设置,但序列值的数据类型除外。要获得完整的语法图,请查阅 DB2 SQL 参考指南(参见 参考资料)。
删除序列对象与删除任何其他数据库对象一样。语句末尾的 RESTRICT 关键字用于防止在存在依赖项的情况下删除序列。这是默认行为。您可在语句中显式地指定 RESTRICT 关键字。
DROP SEQUENCE myseq RESTRICT
生成和检索序列值
序列 是数据库对象的一种类型;因此,其访问也由权限控制。默认情况下,只有序列的创建者、SYSADM 和 DBADM 拥有对象的 USAGE 权限。如果希望其他用户能使用该序列,需使用以下语句:
GRANT USAGE ON SEQUENCE seq_object_name TO PUBLIC
如果要更改序列对象的属性,需要有对象的 ALTER 权限:
GRANT ALTER ON SEQUENCE seq_object_name TO GROUP group_name
请查阅标题为 “服务器管理” 的 DB2 DBA 认证教程,了解关于 DB2 安全的更多信息。
系统提供了两个表达式用于生成和检索序列值。NEXT VALUE FOR seq-name 用于获得下一个序列值,而 PREVIOUS VALUE FOR seq-name 用于检索上一个生成的序列值。下面的清单 2 中的示例展示了这些表达式的用法。
清单 2. NEXT VALUE FOR 和 PREVIOUS VALUE FOR 表达式
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'BOB');
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAT');
COMMIT;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'GENE');
ROLLBACK;
INSERT INTO t1 VALUES (NEXT VALUE FOR myseq, 'PAUL');
VALUES PREVIOUS VALUE FOR myseq INTO :hostvar
假设以一个空表 t1 开始操作,并且 myseq 的下一个序列值为 1。禁用自动提交,执行上面的语句后,表 t1 将包含下列行:
1 NAME
------- -------
1 BOB
2 PAT
4 PAUL
3 record(s) selected.
虽然生成的 GENE 值发生了回滚,但 DB2 不会重用该值。因此,下一个为 PAUL 生成的序列值为 4 而不是 3。
上面清单 2 中的最后一个语句展示了 PREVIOUS VALUE 表达式的用法。主机变量 :hostvar 存储当前会话中生成的最后一个值。如果希望保存以前生成的任何值,应在生成下一个值之前保存前一个值。
临时表
顾名思义,临时表 不是永久数据库对象。临时表的行为跟普通表相似,但并不支持或需要所有特性和选项。它只在连接期间存在。连接关闭时,其中声明的所有临时表将被自动删除。
只有声明临时表的会话或应用程序可访问该临时表。如果两个应用程序创建了同名的临时表,则表的每个实例是惟一的。因此,无需担心出现临时数据冲突的情况;因为临时表只允许单个连接访问,所以无需进行锁定。这是临时表的主要性能优点之一。
声明临时表
要声明临时表,必须存在 USER 临时表空间,以便存储临时表的定义和内容。(USER 临时表空间与 SYSTEM 临时表空间不同;后者只在 DB2 内部用于执行排序等操作。)下面这个简单语句创建一个 USER 临时表空间:
CREATE USER TEMPORARY TABLESPACE usertempspace
MANAGED BY SYSTEM USING ('usertempspace')
声明全局临时表时,支持很多可选子句。 清单 3 中