Oracle Applications R12并发程序双参数非空校验实现方法咨询
我在Oracle Apps R12里处理过不少类似的参数校验需求,给你分享几种靠谱的实现方案,从参数层面的前置校验到程序内部的逻辑判断都有,你可以根据实际场景选择:
方法一:前处理程序校验(推荐,提交时即时拦截)
这种方法会在用户提交并发请求后、主程序运行前就做参数校验,能第一时间给用户反馈,体验最好。
步骤:
创建前处理校验存储过程
在自定义的业务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; /注册前处理程序为并发程序
登录Oracle Apps系统,进入系统管理员职责,导航到:并发 -> 程序 -> 定义
新建一个并发程序,类型选择PL/SQL存储过程,执行文件填刚才创建的XX_PRE_VALIDATE_P1_P2,并添加对应的P1、P2参数(和主程序参数的类型、显示名称保持一致)。关联到目标报表并发程序
找到你要设置的报表并发程序定义页面,在前处理程序字段中选择刚才注册的前处理程序。保存后,用户提交请求时就会先触发校验,两个参数都为空的话会直接弹出错误提示,不会运行主程序。
方法二:主程序内部校验(简单直接)
如果不想额外注册前处理程序,也可以在报表的核心代码开头直接加入校验逻辑,适合快速实现:
假设你的报表是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是基于值集的参数,可以通过自定义值集的验证函数来实现联动校验,但这种方法需要注意参数的依赖顺序:
- 创建一个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; / - 编辑其中一个参数(比如P1)的值集,将验证类型改为自定义,并关联这个函数,同时把P2的值作为参数传递给函数(需要在值集的验证参数里配置)。
这种方法配置稍复杂,更适合参数本身就依赖值集的场景,一般优先推荐方法一。
内容的提问来源于stack exchange,提问作者Nikhil

