You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle中获取LOB定位器并更新未填充的BLOB列

Oracle 更新BLOB列:通过LOB定位器写入文件内容

以下是针对已存在行的BLOB列进行更新的PL/SQL代码,核心是通过RETURNING子句获取可写的LOB定位器,再将文件内容写入:

DECLARE
  l_dir    VARCHAR2(20) := 'TEMP_DIRECTORY';
  l_file   VARCHAR2(20) := 'AAPL.pdf';
  l_bfile  BFILE;
  l_blob   BLOB;
BEGIN
  -- 更新目标行,获取可写的BLOB定位器
  UPDATE article_history
  SET pdf_report = EMPTY_BLOB()
  WHERE ticker = 'AAPL'  -- 根据实际业务条件定位要更新的行
    AND date_published = SYSDATE  -- 条件需精准匹配目标数据
  RETURNING pdf_report INTO l_blob;

  -- 关联服务器端文件
  l_bfile := BFILENAME(l_dir, l_file);
  
  -- 打开文件并写入BLOB
  DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
  DBMS_LOB.loadfromfile(l_blob, l_bfile, DBMS_LOB.getlength(l_bfile));
  DBMS_LOB.fileclose(l_bfile);

  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    -- 异常处理:关闭已打开的文件,回滚事务
    IF DBMS_LOB.fileisopen(l_bfile) = 1 THEN
      DBMS_LOB.fileclose(l_bfile);
    END IF;
    ROLLBACK;
    RAISE;  -- 重新抛出异常便于排查问题
END;
/

关键注意事项

  • 获取可写定位器:必须使用UPDATE ... RETURNING ... INTO语法,直接SELECT得到的BLOB定位器是只读的,无法写入内容。
  • 行定位准确性:WHERE子句必须精准匹配目标行,避免误更新其他数据。
  • 权限与文件校验:确保数据库用户对TEMP_DIRECTORY目录对象拥有READ权限,且服务器对应路径下存在目标文件。
  • 异常防护:添加异常块可以避免文件未关闭或事务未回滚的情况,提升代码健壮性。

内容的提问来源于stack exchange,提问作者Landon Statis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:05:05