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

Oracle APEX 21.2.0 如何调用返回BLOB的PL/SQL函数展示图片

方案1:直接配置Display Image项调用自定义函数(最简便,优先选)

不需要额外写多余代码,直接用控件原生能力即可,配置步骤:

  • 进入对应页面的设计器,选中你要用来展示图片的Display Image类型项
  • 在右侧属性面板找到源分组,将「源类型」从默认的「数据库列」修改为PL/SQL函数体返回BLOB
  • 在PL/SQL代码输入框中直接调用你的自定义函数,入参绑定对应页面项,注意必须用绑定变量写法,不要硬拼接值,参考代码:
return 你的自定义函数名(
  imageDate => :PXX_QUERY_DATE, -- 替换为页面上存储查询日期的项名,比如P1_IMAGE_DATE
  personId  => :PXX_PERSON_ID   -- 替换为页面上存储当前人员ID的项名,比如P1_PERSON_ID
);
  • 下拉到「设置」属性组,如果你不确定函数返回的图片格式,直接打开「根据文件内容检测MIME类型」开关,避免因MIME类型不匹配出现裂图;如果确定格式(比如统一存的JPG),直接手动指定MIME类型为image/jpeg即可
  • 找到「高级」属性组的「要提交的页项」,把上面两个作为入参的页面项填进去,这样入参的值变化时,图片会自动随页面提交刷新,不需要额外写动态动作。
方案2:自定义HTTP输出端点(适合多位置复用图片的场景)

如果你需要在报告列、静态HTML区域、甚至跨应用复用这个图片输出逻辑,不要绑死在单个页面项上,可以建一个应用级AJAX回调过程来输出图片:

  • 进入共享组件→应用进程,新建一个名为GET_PERSON_IMAGE的进程,执行点选「按需」
  • 进程内写如下逻辑,接收参数、调用函数、直接输出BLOB到HTTP响应:
DECLARE
  l_img_blob   BLOB;
  l_mime_type  VARCHAR2(100) := 'image/png'; -- 按实际图片类型修改,jpg对应image/jpeg
BEGIN
  -- 从请求中取传入的两个参数
  l_img_blob := 你的自定义函数名(
    imageDate => TO_DATE(APEX_APPLICATION.G_X01, 'YYYY-MM-DD'),
    personId  => APEX_APPLICATION.G_X02
  );
  -- 空值判断,没图的时候可以输出默认占位图
  IF DBMS_LOB.GETLENGTH(l_img_blob) IS NULL THEN
    -- 这里可以替换成你内置的默认占位图BLOB
    l_img_blob := NULL;
  END IF;
  -- 设置响应头
  OWA_UTIL.MIME_HEADER(l_mime_type, FALSE);
  APEX_UTIL.HTTP_HEADER('Content-Length', DBMS_LOB.GETLENGTH(l_img_blob));
  APEX_UTIL.HTTP_HEADER('Cache-Control', 'max-age=7200'); -- 按需配置缓存时间,减少重复查询
  OWA_UTIL.HTTP_HEADER_CLOSE;
  -- 输出图片二进制流
  WPG_DOCLOAD.DOWNLOAD_FILE(l_img_blob);
END;
  • 调用时两种用法:
    • 给Display Image项设置源类型为「图像URL」,填入APEX标准调用地址即可
    • 直接在任意支持HTML的位置写img标签引入,地址格式参考:wwv_flow.show?p_flow_id=&APP_ID.&p_flow_step_id=0&p_request=APPLICATION_PROCESS=GET_PERSON_IMAGE&x01=&P1_QUERY_DATE.&x02=&P1_PERSON_ID.
方案3:APEX集合中转(适合函数逻辑重、避免重复调用的场景)

如果你的自定义函数计算逻辑复杂、查询耗时长,不想在同一次页面加载中重复执行,可以用APEX临时集合做中转:

  • 在页面渲染前的前置处理(或者入参变化触发的动态动作里),先调用函数拿到图片BLOB,存入命名为PERSON_IMAGE_TMP的APEX集合,为BLOB生成唯一标识
  • Display Image项的源类型选择「存储在APEX集合中的BLOB」,绑定对应集合的BLOB列即可,整个页面生命周期只会执行一次函数,降低数据库压力。

注意事项:所有传参必须用绑定变量或者APEX内置的参数传递接口,不要拼接SQL字符串避免注入风险;如果图片是敏感数据,记得在函数逻辑里加当前登录用户的权限校验,防止用户篡改参数越权查看他人图片。

内容的提问来源于stack exchange,提问作者Milan Ruzic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:27:18