COPY 存储过程用于将源内部 LOB 的全部或一部分复制到目标内部 LOB

您可以指定源 LOB 和目标 LOB 的偏移量,以及要复制的字节数或字符数。

语法

  1. DBMS_LOB.COPY (
  2. dest_lob IN OUT NOCOPY BLOB,
  3. src_lob IN BLOB,
  4. amount IN INTEGER,
  5. dest_offset IN INTEGER := 1,
  6. src_offset IN INTEGER := 1);
  7. DBMS_LOB.COPY (
  8. dest_lob IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,
  9. src_lob IN CLOB CHARACTER SET ANY_CS,
  10. amount IN INTEGER,
  11. dest_offset IN INTEGER := 1,
  12. src_offset IN INTEGER := 1);

参数解释

参数

解释

dest_lob

复制目标的 LOB 定位器。

src_lob

复制源的 LOB 定位器。

amount

要复制的字节数(BLOB)或字符(CLOB)。

dest_offset

复制起始地址在目标 LOB 中的偏移量(以字节或字符为单位,原点为 1)。

src_offset

复制起始地址在源 LOB 中字节或字符(原点为 1)的偏移量。

异常情况

异常

描述

VALUE_ERROR

任何输入参数均为 NULL 或无效。

INVALID_ARGVAL

发生以下某种情况:

  •  src_offset 或 dest_offset < 1

  • src_offset 或 dest_offset > LOBMAXSIZE

  • amount 小于 1

  • amount 大于 LOBMAXSIZE

QUERY_WRITE

无法在查询中执行 LOB 写入。

BUFFERING_ENABLED

如果在 LOB 上启用了缓冲,则无法在启用 LOB 缓冲的情况下执行操作。

使用说明

  • 如果目标 LOB 中指定的偏移量超出了此 LOB 中当前数据的末尾,则将零字节填充符或空格分别插入到目标 BLOBCLOB 中。如果偏移量小于目标 LOB 的当前长度,则现有数据将被覆盖。

  • 指定数量超出源 LOB 中数据长度不会报错。因此,可以指定大量要从源 LOB 复制的数据,这会将从 src_offset 开始到源 LOB 末尾的数据全部复制。

  • 不强制要求将 LOB 操作包裹在 Open/Close 接口中。如果在执行操作之前没有打开 LOB,则在调用过程中会更新 LOB 列上的功能索引和域索引。但是,如果在执行操作之前打开了 LOB,则必须在提交事务之前将其关闭。关闭内部 LOB 时,将同时更新 LOB 列上的功能索引和域索引。

    如果未将 LOB 操作包裹在 Open/Close 接口内,则每次写入 LOB 时都会更新功能索引和域索引。为了避免影响性能,建议将对 LOB 的写操作包含在 OPENCLOSE 语句中。

  • 复制之前,如果源和目标 LOB 已归档,则先对其进行检索。对于全覆盖的情况,不会检索目标 LOB