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

使用APEX_DATA_EXPORT将生成的PDF文件存储到数据库的实现问题

解决方案

你现有代码的核心问题是INSERT语句直接传入了apex_data_export.t_export类型的结构体变量,而表pdf_test4的pdf字段是BLOB类型,你需要从导出结构体中取出BLOB内容再插入。

修正后的代码如下

DECLARE
    l_context apex_exec.t_context; 
    l_export  apex_data_export.t_export;
BEGIN
    -- 如果你是在APEX页内执行这段逻辑,不需要额外调用apex_session.create_session,只有在外部PL/SQL上下文执行时才需要
    /*
    apex_session.create_session (
    p_app_id   => 130408,
    p_page_id  => 1,
    p_username => 'EXAMPLE USER' );
    */

    l_context := apex_exec.open_query_context(
        p_location    => apex_exec.c_location_local_db,
        p_sql_query   => 'select * from emp' );

    l_export := apex_data_export.export (
        p_context   => l_context,
        p_format    => nvl(:format, apex_data_export.c_format_pdf),
        p_file_name => 'employees' );

    apex_exec.close( l_context );

    -- 如果你不需要触发浏览器下载,可以完全删掉这行download调用
    /*
    apex_data_export.download(
        p_export => l_export,
        p_stop_apex_engine => false);
    */

    -- 正确插入:取结构体中的content_blob字段,就是生成的PDF二进制内容
    INSERT INTO pdf_test4 (pdf, file_name, create_time) 
    VALUES (l_export.content_blob, l_export.file_name||'.'||l_export.format, SYSDATE);

    COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        IF apex_exec.is_open(l_context) THEN
            apex_exec.close( l_context );
        END IF;
        RAISE;
END;

关键调整点说明

  • apex_data_export.t_export是复合类型,其中content_blob属性才存储生成文件的二进制内容,必须取该字段插入BLOB列
  • 如果你不需要给前端返回下载流,apex_data_export.download调用可以直接删除,不影响文件生成
  • 异常块中增加了上下文是否打开的判断,避免重复关闭报错
  • 如果是在APEX页面进程、动态动作等APEX原生上下文执行代码,不需要手动创建会话,只有在SQL Developer、定时任务等外部PL/SQL环境调用时才需要调用apex_session.create_session
  • 插入完成后记得加COMMIT,否则事务不会提交,其他会话看不到插入的记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:03