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

如何在Oracle APEX中不使用RAISE_APPLICATION_ERROR处理自定义函数错误

在Oracle APEX中从PL/SQL返回自定义错误消息并显示

问题背景

开发Oracle APEX应用时,使用自定义PL/SQL函数处理业务逻辑,希望在页面上显示内联消息或通知类错误,而非通过RAISE_APPLICATION_ERROR抛出异常(该方式会终止流程)。尝试了自定义错误处理函数但未生效,代码如下:

create or replace function APEX_ERROR_CUSTOM
    (
      p_error IN apex_error.t_error 
    )
    RETURN apex_error.t_error_result
  IS
    l_result          apex_error.t_error_result := apex_error.t_error_result();
    c_inline_with_field            constant varchar2(40):='INLINE_WITH_FIELD';  
    c_inline_in_notification       constant varchar2(40):='INLINE_IN_NOTIFICATION';      
  BEGIN 
     
    l_result := apex_error.init_error_result ( p_error => APEX_ERROR_CUSTOM.p_error );  

    -- only remove ORA error for user defined exceptions
    IF p_error.ora_sqlcode BETWEEN -20999 AND -20000 THEN
        l_result.message := REPLACE(l_result.message,'ORA'||p_error.ora_sqlcode||': ','');
    END IF;

    RETURN l_result;
  END APEX_ERROR_CUSTOM;
/

解决方案

方式一:不终止流程,直接在PL/SQL中添加错误消息

如果需要流程继续执行,无需抛出异常,直接调用APEX内置的apex_error.add_error函数,可将错误消息绑定到页面项或显示为通知:

CREATE OR REPLACE PROCEDURE process_business_logic(
    p_input IN VARCHAR2
) AS
BEGIN
    -- 业务逻辑校验
    IF p_input IS NULL OR LENGTH(p_input) < 5 THEN
        -- 方式1:添加内联错误到指定页面输入项
        apex_error.add_error(
            p_message          => '输入内容不能为空且长度至少为5位',
            p_display_location => apex_error.c_inline_with_field,
            p_page_item_name   => 'P1_INPUT' -- 替换为你的页面项名称
        );
        
        -- 方式2:添加全局通知型错误
        -- apex_error.add_error(
        --     p_message          => '业务处理失败:输入格式不符合要求',
        --     p_display_location => apex_error.c_inline_in_notification
        -- );
    ELSE
        -- 正常业务逻辑执行
        NULL;
    END IF;
END process_business_logic;
/

调用该过程后,流程不会终止,APEX会自动在页面对应位置显示错误消息。

方式二:修复自定义错误处理函数(适用于仍需抛出异常的场景)

如果坚持使用RAISE_APPLICATION_ERROR,需先修复原函数的参数引用错误,再配置到应用中:

1. 修正错误处理函数

原代码中apex_error.init_error_result的参数引用错误,需改为直接使用p_error:

CREATE OR REPLACE FUNCTION APEX_ERROR_CUSTOM(
    p_error IN apex_error.t_error 
) RETURN apex_error.t_error_result IS
    l_result apex_error.t_error_result := apex_error.t_error_result();
    c_inline_with_field CONSTANT VARCHAR2(40) := 'INLINE_WITH_FIELD';  
    c_inline_in_notification CONSTANT VARCHAR2(40) := 'INLINE_IN_NOTIFICATION';      
BEGIN 
    -- 修正参数引用
    l_result := apex_error.init_error_result(p_error => p_error);  

    -- 移除用户自定义异常的ORA前缀
    IF p_error.ora_sqlcode BETWEEN -20999 AND -20000 THEN
        l_result.message := REPLACE(l_result.message, 'ORA' || p_error.ora_sqlcode || ': ', '');
    END IF;

    RETURN l_result;
END APEX_ERROR_CUSTOM;
/

2. 配置到APEX应用

  • 进入应用的「共享组件」
  • 打开「应用定义属性」
  • 在「错误处理」区域,将「自定义错误处理函数」设置为APEX_ERROR_CUSTOM

注意:该方式下RAISE_APPLICATION_ERROR仍会终止当前PL/SQL块的执行,仅优化错误消息的显示格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:34:52