WRITE 存储过程用于将指定数量的数据写入内部 LOB(从以 LOB 开头的绝对偏移量开始计算)。
数据是从 buffer
参数写入的。WRITE 以指定的长度替换(覆盖)LOB 偏移量中已存在的任何数据。
语法
DBMS_LOB.WRITE (
lob_loc IN OUT NOCOPY BLOB,
amount IN INTEGER,
offset IN INTEGER,
buffer IN RAW);
DBMS_LOB.WRITE (
lob_loc IN OUT NOCOPY CLOB,
amount IN INTEGER,
offset IN INTEGER,
buffer IN VARCHAR2);
参数解释
参数 | 解释 |
---|---|
lob_loc | 要写入的内部 LOB 的定位符。详细信息请参见 DBMS_LOB 使用说明。 |
amount | 要写入的字节数(对于 |
offset | 开始读取 LOB 的字节数(对于 |
buffer | 用于写的输入缓冲区。 |
异常情况
异常 | 描述 |
---|---|
VALUEERROR |
|
INVALID_ARGVAL | 可能为以下几种情况:
|
QUERY_WRITE | 无法在查询或 PDML 并行执行服务器内执行 LOB 写入。 |
BUFFERING_ENABLED | 如果在 LOB 上启用了缓冲,则无法在启用 LOB 缓冲的情况下执行操作。 |
SECUREFILE_OUTOFBOUNDS | 尝试执行写操作并略过标有 FRAGMENT * 的 LOB 末位。 |
使用说明
如果输入量大于缓冲区中的数据,则会出现错误。如果输入量小于缓冲区中的数据,仅将缓冲区中的字节或字符量写入 LOB。如果指定的偏移量超出了 LOB 中当前数据的末位,则将零字节填充符或空格分别插入
BLOB
或CLOB
中。VARCHAR2
缓冲区的形式必须与CLOB
参数的形式匹配。也就是说,如果输入 LOB 参数的类型为CLOB
,则缓冲区必须包含CHAR
数据。从客户端调用
DBMS_LOB.WRITE
时,缓冲区必须包含客户端字符集中的数据。在将缓冲区数据写入 LOB 之前,数据库会将客户端缓冲区转换为服务器的字符集。不强制要求将 LOB 操作包裹在 Open / Close 接口中。如果在执行操作之前没有打开 LOB,在调用过程中会更新 LOB 列上的功能索引和域索引。如果在执行操作之前打开了 LOB,必须在提交事务之前将其关闭。在关闭内部 LOB 时,将更新 LOB 列上的功能索引和域索引。
如果未将 LOB 操作包装在 Open / Close 接口内,每次写入 LOB 时都会更新功能索引和域索引。为避免对性能产生不利影响,建议将对 LOB 的写操作包含在
OPEN
或CLOSE
语句中。必要时,WRITE 会在写入 LOB 之前获取 LOB,除非指定写操作以覆盖整个 LOB。