我有以下收集声明
TYPE T_TABLE1 IS TABLE OF TABLE_1%ROWTYPE INDEX BY BINARY_INTEGER;
tbl1_u T_TABLE1;
tbl1_i T_TABLE1;
此表将继续增长,最后,将在FORALL循环中用于在TABLE_1上执行插入或更新。
现在可能存在我想要删除某个元素的情况。所以我打算创建一个过程,它将获取KEY(唯一)并匹配元素(如果找到该键)
PSEDUO CODE
FOR i in tbl1_u.FIST..tbl1_u.LAST
LOOP
if tbl1_u(i).key = key then
tbl1.delete(i);
end if;
END LOOP;
我的问题是,
一旦我删除了特定元素,就会自动调整集合,即索引i将被下一个元素替换,或者该特定索引将保持为空/无效,如果我在其中使用它可能会给我异常FORALL INSERT / UPDATE?
我不认为我可以将TABLE_1%ROWTYPE对象传递给一个过程,我是否必须创建一个记录类型?
答案 0 :(得分:2)
鉴于TABLE_1.KEY是唯一的,您可以考虑将其用作关联数组的索引。这样,您可以使用KEY值从集合中删除,根据伪代码在执行删除时可以使用该值。这也可以节省你不得不遍历表来找到你想要的KEY,因为KEY将是索引 - 所以你的“删除”伪代码将成为:
tbl1_u.delete(key);
回答你的问题:
由于您正在使用关联数组,因此删除元素时,集合中没有“空”空间。但是,元素的索引实际上并没有改变。因此,您需要使用collection.PRIOR and collection.NEXT方法循环遍历集合。但同样,如果您使用KEY值作为索引,则可能根本不需要遍历集合。
您可以将TABLE_1%ROWTYPE作为参数传递给PL / SQL过程或函数。
您可能需要考虑使用MERGE语句,该语句可以在一个步骤中处理插入和更新。这可能允许您只维护一个集合。可能值得一试。
分享并享受。