如何编写支持可变参数的通用PLSQL并发请求提交函数?
通用PLSQL并发请求提交函数实现方案
可以实现,最优方案是基于并发程序元数据动态处理可变参数,无需手动判断参数数量,核心思路是通过查询系统的并发程序参数元数据表,自动匹配传入的参数数量并完成请求提交。
实现步骤
- 定义可变参数类型,用于接收任意数量的并发程序参数值
- 在函数内部查询目标并发程序的参数元数据,获取参数总数、必填规则等信息
- 校验传入参数数量与元数据定义的一致性
- 动态映射参数值并调用
FND_REQUEST.SUBMIT_REQUEST提交请求
代码实现
1. 创建可变参数类型
CREATE OR REPLACE TYPE VARCHAR2_TABLE_TYPE AS TABLE OF VARCHAR2(4000); /
2. 编写通用提交函数
CREATE OR REPLACE FUNCTION submit_concurrent_request( p_app_short_name IN VARCHAR2, p_prog_short_name IN VARCHAR2, p_request_description IN VARCHAR2 DEFAULT NULL, p_args IN VARCHAR2_TABLE_TYPE ) RETURN NUMBER IS l_prog_id NUMBER; l_app_id NUMBER; l_param_count NUMBER; l_request_id NUMBER; -- 定义足够多的参数变量,覆盖系统中并发程序的最大参数数(示例到10个,可按需扩展) l_param1 VARCHAR2(4000); l_param2 VARCHAR2(4000); l_param3 VARCHAR2(4000); l_param4 VARCHAR2(4000); l_param5 VARCHAR2(4000); l_param6 VARCHAR2(4000); l_param7 VARCHAR2(4000); l_param8 VARCHAR2(4000); l_param9 VARCHAR2(4000); l_param10 VARCHAR2(4000); BEGIN -- 获取应用ID和并发程序ID SELECT application_id, concurrent_program_id INTO l_app_id, l_prog_id FROM fnd_concurrent_programs_vl WHERE application_short_name = p_app_short_name AND concurrent_program_name = p_prog_short_name; -- 查询启用的参数总数 SELECT COUNT(*) INTO l_param_count FROM fnd_concurrent_program_params WHERE application_id = l_app_id AND concurrent_program_id = l_prog_id AND enabled_flag = 'Y' ORDER BY sequence_num; -- 校验参数数量匹配 IF p_args.COUNT != l_param_count THEN RAISE_APPLICATION_ERROR(-20001, '参数数量不匹配:预期' || l_param_count || '个,实际传入' || p_args.COUNT || '个'); END IF; -- 批量赋值参数变量 IF l_param_count >= 1 THEN l_param1 := p_args(1); END IF; IF l_param_count >= 2 THEN l_param2 := p_args(2); END IF; IF l_param_count >= 3 THEN l_param3 := p_args(3); END IF; IF l_param_count >= 4 THEN l_param4 := p_args(4); END IF; IF l_param_count >= 5 THEN l_param5 := p_args(5); END IF; IF l_param_count >= 6 THEN l_param6 := p_args(6); END IF; IF l_param_count >= 7 THEN l_param7 := p_args(7); END IF; IF l_param_count >= 8 THEN l_param8 := p_args(8); END IF; IF l_param_count >= 9 THEN l_param9 := p_args(9); END IF; IF l_param_count >= 10 THEN l_param10 := p_args(10); END IF; -- 提交并发请求 l_request_id := FND_REQUEST.SUBMIT_REQUEST( application => p_app_short_name, program => p_prog_short_name, description => p_request_description, start_time => NULL, sub_request => FALSE, argument1 => l_param1, argument2 => l_param2, argument3 => l_param3, argument4 => l_param4, argument5 => l_param5, argument6 => l_param6, argument7 => l_param7, argument8 => l_param8, argument9 => l_param9, argument10 => l_param10 ); IF l_request_id = 0 THEN RAISE_APPLICATION_ERROR(-20002, '请求提交失败,请检查程序名称及参数合法性'); END IF; RETURN l_request_id; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20003, '未找到指定并发程序:应用[' || p_app_short_name || '] 程序[' || p_prog_short_name || ']'); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20004, '提交出错:' || SQLERRM); END; /
使用示例
提交一个包含3个参数的并发程序:
DECLARE l_req_id NUMBER; BEGIN l_req_id := submit_concurrent_request( p_app_short_name => 'GL', p_prog_short_name => 'GL_JOURNAL_IMPORT', p_request_description => '测试日记账导入', p_args => VARCHAR2_TABLE_TYPE('IMPORT_BATCH_001', 'Y', 'GL') ); DBMS_OUTPUT.PUT_LINE('请求ID:' || l_req_id); END; /
方案优势
- 完全基于系统元数据驱动,无需为每个并发程序编写硬编码判断
- 自动适配任意参数数量的并发程序,扩展性强
- 内置参数数量校验,减少人工错误
- 统一的请求提交入口,便于维护和监控
内容的提问来源于stack exchange,提问作者Sangam
相关产品推荐
相关产品推荐

