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

如何编写支持可变参数的通用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:40:38