本主题介绍了在应用程序中使用 LOB 需要熟悉的 LOB 的用法和语义。涵盖了使用 LOB 的各种技术。
在这里,持久性 LOB 假定您正在处理已存在的表中的 LOB,而创建具有 LOB 列的表的任务通常由您的数据库管理员执行。
- 您可以使用临时 LOB 来存储瞬态数据。数据存储在临时表空间而不是常规表空间中。您应该在不再需要临时 LOB 后释放它们。如果不这样做,则不会回收 LOB 在临时表空间中消耗的空间。
- 您可以将临时 LOB 插入表中。执行此操作时,会创建并存储 LOB 的永久副本。
- 您可以使用在 oracle.sql.BLOB 和 oracle.sql.CLOB 类中定义的静态方法 createTemporary 创建临时 LOB。您可以使用 freeTemporary 方法释放临时 LOB。
- 您可以通过调用 isTemporary() 方法来测试 LOB 是否是临时的。如果 LOB 是通过调用 createTemporary 方法创建的,则 isTemporary() 方法返回 true,否则返回 false。
- 您可以通过调用 freeTemporary 方法来释放临时 LOB。在结束会话或调用之前释放任何临时 LOB。
LOB 列状态
访问 LOB 列中的单元格时使用的技术因给定单元格的状态而异。 LOB 列中的单元格可以处于以下任一状态:
- NULL:创建表格单元格,但单元格没有值或定位符。
- 空:单元格中存在具有定位符的 LOB 实例,但在 LOB 的长度为零的情况下它没有任何值。
- 已填充:单元格中存在同时具有定位符和值的 LOB 实例。
锁定包含 LOB 的行
锁定 LOB 的原因是您可以锁定包含 LOB 的行,以防止其他数据库用户在事务期间写入 LOB。锁定包含 LOB的行时,在选择该行时指定 FOR UPDATE子句,如果该行被锁定,则其他用户无法锁定或更新 LOB,直到您结束事务。
打开和关闭 LOB
LOB API 包括使您能够显式打开和关闭 LOB 实例的操作。您可以轻松地打开或关闭任何以下类型的持久 LOB 实例:BLOB、CLOB、NCLOB 或 BFILE。您可以打开一个 LOB 来实现以下一种或两种结果:
- 以只读模式打开 LOB:这可确保在您明确关闭 LOB 之前无法在会话中更改 LOB。例如,您可以打开 LOB 以确保在关键操作中使用 LOB 时程序的其他部分不会更改 LOB。
- 以读/写模式打开LOB——仅限持久 CLOB 、NCLOB 或BLOB实例:以读写模式打开 LOB 会推迟 LOB 列上的任何索引维护,直到您关闭 LOB。仅当 LOB 列上存在可扩展索引并且您不希望数据库在每次写入 LOB 时都执行要维护的索引时,以读写模式打开 LOB 才有用。如果您在 LOB 处于打开状态时对其进行多次写入操作,则此技术将提高应用程序的性能。
- 如果您打开一个 LOB,那么您必须在会话后期的某个时间点关闭该 LOB。这是实现开放 LOB 的唯一要求。当 LOB 实例打开时,您可以在 LOB 上执行任意数量的操作——前提是在给定模式下允许这些操作。
- void open (int 模式)
- 无效关闭()
- 布尔值 isOpen()
- 您应该将 LOB 操作包装在 Open/Close 调用操作中,否则,对 LOB 的每次修改都会隐式地打开和关闭 LOB,从而触发域索引上的任何触发器。请注意,在这种情况下,LOB 上的任何域索引都会在 LOB 修改后立即更新。
- 当您将 LOB 操作包装在 Open/Close 调用操作中时,不会为每个 LOB 修改触发触发器。取而代之的是,域索引上的触发器将在 Close 调用操作时触发。
- 当您通过调用 open 或 open(int) 方法打开 LOB 时。然后,您可以读取或写入 LOB,而无需与该 LOB 触发相关联的任何触发器。完成对 LOB 的访问后,通过调用 close 方法关闭 LOB。当您关闭 LOB 时,任何与 LOB 关联的触发器都会触发。
- 您可以通过调用 isOpen方法检查 LOB 是打开还是关闭。每当您通过调用 open(int) 方法打开 LOB 时,参数的值必须是MODE_READONLY或MODE_READWRITE ,如 oracle.sql.BLOB 和 oracle.sql.CLOB 类中所定义。如果您使用MODE_READONLY打开 LOB,则任何写入 LOB 的尝试都将导致 SQL 异常。