如何从PLSQL的TABLE TYPE中移除符合条件的记录?
PL/SQL 关联数组记录过滤解决方案
方法一:插入时直接过滤推荐
在向关联数组插入数据的循环中,直接判断当前记录是否符合保留条件,仅插入需要保留的记录,避免后续额外的清理操作,效率更高。
修改后的插入代码如下:
FOR x_ IN get_data LOOP -- 仅保留pet_ctg不在pet_tpy中的记录 IF INSTR(x_.pet_tpy, x_.pet_ctg) = 0 THEN custom_type_.pet_name := x_.pet_name; custom_type_.pet_ctg := x_.pet_ctg; custom_type_.pet_tpy := x_.pet_tpy; i_ := i_ + 1; custom_type_rec_tab_(i_) := custom_type_; END IF; END LOOP;
这里利用INSTR函数判断子串存在性:当返回值为0时,说明pet_ctg不是pet_tpy的子串,符合保留要求,才将记录加入数组。
方法二:插入后批量清理现有数组
如果已经完成数据插入,需要对已有的关联数组进行清理,可以通过“先收集待删除索引,再批量删除”的方式处理,避免遍历过程中直接删除元素导致的索引混乱。
示例代码:
DECLARE TYPE idx_tab_type IS TABLE OF PLS_INTEGER INDEX BY BINARY_INTEGER; idx_to_delete idx_tab_type; idx_count PLS_INTEGER := 0; current_idx PLS_INTEGER; BEGIN -- 遍历数组,收集需要删除的记录索引 current_idx := custom_type_rec_tab_.FIRST; WHILE current_idx IS NOT NULL LOOP -- 检查pet_ctg是否存在于pet_tpy中,是则标记索引 IF INSTR(custom_type_rec_tab_(current_idx).pet_tpy, custom_type_rec_tab_(current_idx).pet_ctg) > 0 THEN idx_count := idx_count + 1; idx_to_delete(idx_count) := current_idx; END IF; current_idx := custom_type_rec_tab_.NEXT(current_idx); END LOOP; -- 根据标记的索引删除对应记录 current_idx := idx_to_delete.FIRST; WHILE current_idx IS NOT NULL LOOP custom_type_rec_tab_.DELETE(idx_to_delete(current_idx)); current_idx := idx_to_delete.NEXT(current_idx); END LOOP; END;
关键说明:
INSTR函数是PL/SQL中判断子串是否存在的常用方法,返回值大于0表示子串存在。- 先收集待删除索引再统一删除,是因为关联数组的索引是整数型,直接在遍历中删除会导致后续遍历跳过元素或出现异常。
内容的提问来源于stack exchange,提问作者Bishan Vithanage
相关产品推荐
相关产品推荐

