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

Oracle Applications R12并发程序双参数非空校验实现方法咨询

在Oracle Applications R12中实现并发程序参数非空校验(至少填一个)

我在Oracle Apps R12里处理过不少类似的参数校验需求,给你分享几种靠谱的实现方案,从参数层面的前置校验到程序内部的逻辑判断都有,你可以根据实际场景选择:

方法一:前处理程序校验(推荐,提交时即时拦截)

这种方法会在用户提交并发请求后、主程序运行前就做参数校验,能第一时间给用户反馈,体验最好。

步骤:

  1. 创建前处理校验存储过程
    在自定义的业务schema(比如XXCUS)下编写PL/SQL过程,专门用来校验P1和P2的非空逻辑:

    CREATE OR REPLACE PROCEDURE XX_PRE_VALIDATE_P1_P2 (
        errbuf OUT VARCHAR2,
        retcode OUT VARCHAR2,
        p_p1 VARCHAR2, -- 和主程序P1参数类型一致
        p_p2 VARCHAR2  -- 和主程序P2参数类型一致
    ) IS
    BEGIN
        -- 默认返回成功状态
        retcode := '0';
        
        -- 核心校验逻辑:两个参数不能同时为空
        IF p_p1 IS NULL AND p_p2 IS NULL THEN
            errbuf := '错误提示:参数P1和P2不能同时为空,请至少输入其中一个值。';
            retcode := '2'; -- 设置为错误状态,终止后续主程序运行
            RAISE_APPLICATION_ERROR(-20001, errbuf);
        END IF;
    EXCEPTION
        WHEN OTHERS THEN
            errbuf := '参数校验失败:' || SQLERRM;
            retcode := '2';
    END XX_PRE_VALIDATE_P1_P2;
    /
    
  2. 注册前处理程序为并发程序
    登录Oracle Apps系统,进入系统管理员职责,导航到:

    并发 -> 程序 -> 定义
    新建一个并发程序,类型选择PL/SQL存储过程,执行文件填刚才创建的XX_PRE_VALIDATE_P1_P2,并添加对应的P1、P2参数(和主程序参数的类型、显示名称保持一致)。

  3. 关联到目标报表并发程序
    找到你要设置的报表并发程序定义页面,在前处理程序字段中选择刚才注册的前处理程序。保存后,用户提交请求时就会先触发校验,两个参数都为空的话会直接弹出错误提示,不会运行主程序。

方法二:主程序内部校验(简单直接)

如果不想额外注册前处理程序,也可以在报表的核心代码开头直接加入校验逻辑,适合快速实现:

假设你的报表是PL/SQL驱动的,在主程序的入口处添加:

-- 先校验参数合法性
IF p_p1 IS NULL AND p_p2 IS NULL THEN
    FND_MESSAGE.SET_NAME('XXCUS', 'XX_BOTH_PARAMS_EMPTY'); -- 提前在消息字典里创建这个自定义消息
    FND_MESSAGE.SET_TOKEN('PARAM1', 'P1');
    FND_MESSAGE.SET_TOKEN('PARAM2', 'P2');
    FND_MESSAGE.RAISE_ERROR; -- 抛出错误,终止程序
END IF;

-- 后续正常的报表生成逻辑...

记得先在应用开发者职责的消息字典里创建XX_BOTH_PARAMS_EMPTY消息,内容可以设为:参数&PARAM1和&PARAM2不能同时为空,请至少输入其中一个。

这种方法的缺点是,并发请求已经被提交到队列后才会报错,用户可能需要等一会儿才能收到反馈,不如前处理程序及时。

方法三:自定义值集联动校验(适合参数值集场景)

如果P1和P2是基于值集的参数,可以通过自定义值集的验证函数来实现联动校验,但这种方法需要注意参数的依赖顺序:

  1. 创建一个PL/SQL验证函数,用来判断两个参数是否同时为空:
    CREATE OR REPLACE FUNCTION XX_VALIDATE_PARAMS (
        p_value VARCHAR2, -- 当前参数的值
        p_p2_val VARCHAR2 -- 另一个参数的值,需要通过参数传递
    ) RETURN BOOLEAN IS
    BEGIN
        -- 如果当前参数是空,且另一个参数也空,返回FALSE触发错误
        IF p_value IS NULL AND p_p2_val IS NULL THEN
            FND_MESSAGE.SET_NAME('XXCUS', 'XX_BOTH_PARAMS_EMPTY');
            RETURN FALSE;
        ELSE
            RETURN TRUE;
        END IF;
    EXCEPTION
        WHEN OTHERS THEN
            FND_MESSAGE.SET_NAME('FND', 'SQL_ERROR');
            FND_MESSAGE.SET_TOKEN('ERROR', SQLERRM);
            RETURN FALSE;
    END XX_VALIDATE_PARAMS;
    /
    
  2. 编辑其中一个参数(比如P1)的值集,将验证类型改为自定义,并关联这个函数,同时把P2的值作为参数传递给函数(需要在值集的验证参数里配置)。

这种方法配置稍复杂,更适合参数本身就依赖值集的场景,一般优先推荐方法一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:37:08