将LOB数据存储在 Db2 表格中

Db2 LOB数据与其他类型的数据处理方式不同。 因此,在定义LOB列和插入LOB数据时,有时需要采取额外的操作。

准备工作

Db2 有时会隐式创建LOB表空间、辅助表以及表或分区中每个LOB列的辅助表索引。 更多信息,请参阅 LOB表空间隐式创建

如果 Db2 没有隐式创建LOB表空间、辅助表和辅助表索引,则必须通过发出CREATE TABLESPACE、CREATE AUXILIARY TABLE和CREATE INDEX语句来创建这些对象。

关于本任务

大型对象 和LOB 指的是 Db2 对象,可用于存储大量数据。 LOB是一个长度可变的字符串,最多可包含2GB的数据(1字节)。 Db2 支持以下LOB数据类型:
二进制大对象 (binary large object, BLOB)
使用BLOB来存储二进制数据,例如图片、语音和混合媒体。
字符大对象 (character large object, CLOB)
使用CLOB来存储SBCS或混合字符数据,例如文档。
double-byte character large object(双字节字符大对象,DBCLOB)
使用DBCLOB来存储仅包含DBCS数据的数据。

有关LOB数据类型的更多信息,请参阅大型对象(LOB )。

您可以使用 Db2 来存储LOB数据,但此类数据的存储方式与其他数据不同。

虽然表中可以有LOB列,但实际的LOB数据存储在另一个表中,称为辅助表。 该辅助表存在于一个单独的表空间中,称为 LOB表空间。 每个LOB列必须有一个辅助表。 带有LOB列的表格称为基础表格。 基本表有一个ROWID列, Db2 使用该列在辅助表中定位数据。 辅助表必须有一个索引。

过程

要将LOB数据存储在 Db2 ,请完成以下步骤:

  1. 可选: 在创建或修改表时,最多定义一个ROWID列,即使该表将包含多个LOB列。 如果在定义LOB列之前没有创建ROWID列, Db2 将隐式创建一个具有IMPLICITLY HIDDEN属性的ROWID列,并将其作为表的最后一列附加。

    如果在添加LOB列后添加ROWID列,则表中将有两个ROWID列:隐式创建的列和显式创建的列。 在这种情况下, Db2 确保两个ROWID列的值始终相同。

  2. 通过发出CREATE TABLE语句或一个或多个ALTER TABLE语句,定义一个或多个适当LOB类型列。
  3. 为LOB数据创建表空间和辅助表,除非 Db2 为您隐式创建了这些表。 更多信息,请参阅 LOB表空间隐式创建

    您必须为每个表分区创建一个LOB表空间,并为每个LOB列创建一个辅助表。 例如,如果您的基本表有三个分区,则必须为每个LOB列创建三个LOB表空间和三个辅助表。 使用以下语句创建这些对象 :CREATE LOB TABLESPACE 和CREATE AUXILIARY TABLE语句

    特权套装必须包括以下特权:

    • LOB对象使用的缓冲池和存储组的USE权限
    • 如果明确创建了基本表空间,则还需要在包含该表的数据库上创建 CREATETS(如果数据库是隐式创建的,则使用 DSNDB04 )
  4. 使用CREATE INDEX语句为每个辅助表创建一个索引。 每个辅助表必须有一个索引,每个索引条目都对应一个LOB。
  5. 请使用以下方法之一将LOB数据发送至 Db2
    • 如果LOB列和基础表行的总长度小于32 KB,请使用LOAD实用程序并指定基础表。
    • 否则,请使用INSERT、UPDATE或MERGE语句并指定基础表。 如果使用INSERT语句,请确保应用程序有足够的可用存储空间来容纳要放入LOB列的整个值。

示例

假设您想在员工表中为每位员工添加简历。 员工简历大小不得超过5MB。 由于员工简历包含单字节字符,您可以将简历定义为 Db2 的CLOB。 因此,您需要在员工表中添加一列长度为5 MB的CLOB数据类型。 如果要明确定义 ROWID 列,必须在定义 CLOB 列之前定义它。

首先,执行ALTER TABLE语句添加ROWID列,然后执行另一个ALTER TABLE语句添加CLOB列。 以下语句创建这些列:
ALTER TABLE EMP
  ADD ROW_ID ROWID NOT NULL GENERATED ALWAYS;
COMMIT;
ALTER TABLE EMP
  ADD EMP_RESUME CLOB(5M);
COMMIT;
如果您明确地为该表创建了表空间,且未将“当前规则”特殊寄存器设置为“标准”,则需要定义一个LOB表空间和一个辅助表来保存员工简历。 您还需要在辅助表上定义一个索引。 您必须在同一数据库中定义关联基本表的LOB表空间。 以下语句创建这些对象:
CREATE LOB TABLESPACE RESUMETS
  IN DSN8D12A
  LOG NO
COMMIT;
CREATE AUXILIARY TABLE EMP_RESUME_TAB
  IN DSN8D12A.RESUMETS
  STORES DSN8C10.EMP
  COLUMN EMP_RESUME;
CREATE UNIQUE INDEX XEMP_RESUME
  ON EMP_RESUME_TAB;
COMMIT;
您可以将员工的简历发送至 Db2。 在应用程序中,您可以定义一个主变量来保存简历,将简历数据从文件中复制到主变量中,然后执行UPDATE语句将数据复制到 Db2。 虽然LOB数据存储在辅助表中,但您的UPDATE语句指定了基础表的名称。 以下代码用C语言声明了一个用于存储简历的主变量:
SQL TYPE is CLOB (5M) resumedata;
以下UPDATE语句将数据复制到 Db2
UPDATE EMP SET EMP_RESUME=:resumedata
  WHERE EMPNO=:employeenum;
在此语句中, employeenum 是一个标识与简历关联的员工的主变量。