WRITE 存储过程用于将指定数量的数据写入内部 LOB(从以 LOB 开头的绝对偏移量开始计算)。

数据是从 buffer参数写入的。WRITE 以指定的长度替换(覆盖)LOB 偏移量中已存在的任何数据。

语法

  1. DBMS_LOB.WRITE (
  2. lob_loc IN OUT NOCOPY BLOB,
  3. amount IN INTEGER,
  4. offset IN INTEGER,
  5. buffer IN RAW);
  6. DBMS_LOB.WRITE (
  7. lob_loc IN OUT NOCOPY CLOB,
  8. amount IN INTEGER,
  9. offset IN INTEGER,
  10. buffer IN VARCHAR2);

参数解释

参数

解释

lob_loc

要写入的内部 LOB 的定位符。详细信息请参见 DBMS_LOB 使用说明

amount

要写入的字节数(对于 BLOB)或字符数(对于CLOB)。

offset

开始读取 LOB 的字节数(对于 BLOB)或字符数(对于 CLOB)的偏移量(初始值为 1)。

buffer

用于写的输入缓冲区。

异常情况

异常描述

VALUEERROR

lob_locmountoffset 参数中的任何一个为 NULL,超出范围或无效。

INVALID_ARGVAL

可能为以下几种情况:

  • amount 小于 1

  • amount 大于 32767 字节 (或等效字符)

  • offset 小于 1

  • offset 大于 LOBMAXSIZE

QUERY_WRITE

无法在查询或 PDML 并行执行服务器内执行 LOB 写入。

BUFFERING_ENABLED

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

SECUREFILE_OUTOFBOUNDS

尝试执行写操作并略过标有 FRAGMENT * 的 LOB 末位。

使用说明

  • 如果输入量大于缓冲区中的数据,则会出现错误。如果输入量小于缓冲区中的数据,仅将缓冲区中的字节或字符量写入 LOB。如果指定的偏移量超出了 LOB 中当前数据的末位,则将零字节填充符或空格分别插入 BLOBCLOB 中。

  • VARCHAR2 缓冲区的形式必须与 CLOB 参数的形式匹配。也就是说,如果输入 LOB 参数的类型为 CLOB,则缓冲区必须包含 CHAR 数据。

  • 从客户端调用 DBMS_LOB.WRITE 时,缓冲区必须包含客户端字符集中的数据。在将缓冲区数据写入 LOB 之前,数据库会将客户端缓冲区转换为服务器的字符集。

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

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

  • 必要时,WRITE 会在写入 LOB 之前获取 LOB,除非指定写操作以覆盖整个 LOB。