Oracle APEX实验室订单系统:按集合科室ID生成样本ID并插入数据
修复Oracle APEX实验室订单系统的科室样本ID插入问题
核心问题出在代码未正确读取集合内的科室ID进行分支判断,导致所有检验项目被重复插入到所有科室的表中。以下是修正后的实现方案:
关键修正步骤
- 遍历集合时,准确提取当前检验项目对应的科室ID
- 基于提取到的科室ID,匹配对应科室的序列生成唯一样本ID
- 将检验项目插入到对应科室的数据库表中
修正后的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
相关产品推荐
相关产品推荐

