使用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
相关产品推荐
相关产品推荐

