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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:05:18