Oracle APEX:按钮触发PLSQL,利用APEX_APPLICATION_TEMP_FILES插入BLOB到表
实现步骤(Oracle APEX 20.x)
1. 配置前端文件上传组件
- 在页面添加File Browse类型的页面项(示例命名为
P1_FILE_UPLOAD) - 进入该页面项属性,设置Allowed File Types为
pdf,txt,png,jpeg,jpg(无需加.,APEX会自动识别格式) - 保持默认的Storage Type为
Table APEX_APPLICATION_TEMP_FILES即可,这是APEX临时存储上传文件的默认表
2. 创建上传按钮与动态动作
- 添加一个按钮(示例命名为
BTN_UPLOAD_TO_TABLE),按钮行为选择Submit Page - 给按钮绑定动态动作:
- 触发条件选Button Click,关联刚创建的按钮
- 动作类型选Execute PL/SQL Code,在代码区域填入后续的核心逻辑
3. PL/SQL核心代码示例
假设你的目标表为MY_FILES,表结构如下(可根据实际需求调整):
CREATE TABLE MY_FILES ( FILE_ID NUMBER PRIMARY KEY, FILE_NAME VARCHAR2(255) NOT NULL, FILE_MIME_TYPE VARCHAR2(100) NOT NULL, FILE_CONTENT BLOB NOT NULL, UPLOAD_TIMESTAMP DATE DEFAULT SYSDATE ); -- 可选:创建主键序列 CREATE SEQUENCE SEQ_MY_FILES_ID START WITH 1 INCREMENT BY 1;
动态动作中的PL/SQL代码:
DECLARE v_temp_file_id NUMBER := :P1_FILE_UPLOAD; v_file_name VARCHAR2(255); v_mime_type VARCHAR2(100); v_blob_content BLOB; BEGIN -- 从临时表读取当前用户上传的文件信息 SELECT filename, mime_type, blob_content INTO v_file_name, v_mime_type, v_blob_content FROM apex_application_temp_files WHERE temp_file_id = v_temp_file_id AND created_by = :APP_USER; -- 将文件插入目标表 INSERT INTO MY_FILES (FILE_ID, FILE_NAME, FILE_MIME_TYPE, FILE_CONTENT) VALUES (SEQ_MY_FILES_ID.NEXTVAL, v_file_name, v_mime_type, v_blob_content); -- 可选:清理临时表已处理的文件,节省存储空间 DELETE FROM apex_application_temp_files WHERE temp_file_id = v_temp_file_id; COMMIT; apex_util.set_session_state('P1_UPLOAD_MSG', '文件上传成功'); EXCEPTION WHEN NO_DATA_FOUND THEN apex_util.set_session_state('P1_UPLOAD_MSG', '错误:未找到上传文件,请重新选择'); RAISE; WHEN OTHERS THEN apex_util.set_session_state('P1_UPLOAD_MSG', '上传失败:' || SQLERRM); RAISE; END;
4. 额外注意事项
- 前端格式限制仅作基础校验,可在后端代码中增加MIME类型判断(比如校验
v_mime_type是否为application/pdf、text/plain等目标类型),提升安全性 - 如果需要多文件上传,改用**File Browse (Multiple)**类型页面项,此时页面项值为多个
TEMP_FILE_ID的逗号分隔字符串,需用循环逐个处理 APEX_APPLICATION_TEMP_FILES的数据会被APEX定期清理,但手动删除已处理文件能更快释放空间
内容的提问来源于stack exchange,提问作者yyy62103
相关产品推荐
相关产品推荐

