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

Oracle APEX实验室订单系统:按集合科室ID生成样本ID并插入数据

修复Oracle APEX实验室订单系统的科室样本ID插入问题

核心问题出在代码未正确读取集合内的科室ID进行分支判断,导致所有检验项目被重复插入到所有科室的表中。以下是修正后的实现方案:

关键修正步骤

  1. 遍历集合时,准确提取当前检验项目对应的科室ID
  2. 基于提取到的科室ID,匹配对应科室的序列生成唯一样本ID
  3. 将检验项目插入到对应科室的数据库表中

修正后的PL/SQL代码示例

假设你的集合ORDER_COLLECTION中,第1个属性位存储科室ID(数值型),第2个属性位存储检验项目ID:

DECLARE
    l_dept_id       NUMBER;
    l_test_item_id  NUMBER;
    l_sample_id     VARCHAR2(50);
BEGIN
    -- 遍历集合内的所有检验项目条目
    FOR i IN 1..APEX_COLLECTION.GET_COUNT(p_collection_name => 'ORDER_COLLECTION') LOOP
        -- 从集合中获取当前条目的科室ID和检验项目ID
        l_dept_id := APEX_COLLECTION.GET_MEMBER_ATTRIBUTE_NUMBER(
            p_collection_name => 'ORDER_COLLECTION',
            p_seq             => i,
            p_attr_number     => 1
        );
        l_test_item_id := APEX_COLLECTION.GET_MEMBER_ATTRIBUTE_NUMBER(
            p_collection_name => 'ORDER_COLLECTION',
            p_seq             => i,
            p_attr_number     => 2
        );

        -- 根据科室ID匹配对应序列,生成样本ID并插入对应表
        IF l_dept_id = 1 THEN -- 血液科ID(请替换为实际科室ID)
            l_sample_id := 'HEM-' || HEMATOLOGY_SEQ.NEXTVAL;
            INSERT INTO HEMATOLOGY_TESTS (sample_id, test_item_id)
            VALUES (l_sample_id, l_test_item_id);
        ELSIF l_dept_id = 2 THEN -- 临床检验科ID(请替换为实际科室ID)
            l_sample_id := 'CLIN-' || CLINICAL_LAB_SEQ.NEXTVAL;
            INSERT INTO CLINICAL_LAB_TESTS (sample_id, test_item_id)
            VALUES (l_sample_id, l_test_item_id);
        -- 可继续添加其他科室的分支逻辑
        ELSE
            -- 处理未知科室的异常情况
            RAISE_APPLICATION_ERROR(-20001, '无法识别科室ID: ' || l_dept_id);
        END IF;
    END LOOP;
    COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END;

可选优化(科室较多时)

如果涉及多个科室,用CASE语句替代IF/ELSIF可以让代码更简洁:

CASE l_dept_id
    WHEN 1 THEN
        l_sample_id := 'HEM-' || HEMATOLOGY_SEQ.NEXTVAL;
        INSERT INTO HEMATOLOGY_TESTS (sample_id, test_item_id) VALUES (l_sample_id, l_test_item_id);
    WHEN 2 THEN
        l_sample_id := 'CLIN-' || CLINICAL_LAB_SEQ.NEXTVAL;
        INSERT INTO CLINICAL_LAB_TESTS (sample_id, test_item_id) VALUES (l_sample_id, l_test_item_id);
    -- 追加其他科室分支
    ELSE
        RAISE_APPLICATION_ERROR(-20001, '无法识别科室ID: ' || l_dept_id);
END CASE;

注意事项

  • 请根据你实际的集合属性配置,调整p_attr_number参数(如果科室ID存储在C001这类字符型属性中,改用GET_MEMBER_ATTRIBUTE_VARCHAR2方法)
  • 替换代码中的序列名称、表名和科室ID为系统实际使用的名称和数值
  • 异常处理确保了数据一致性,避免部分插入成功的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:00