处理PL / SQL集合

时间:2013-07-23 21:35:03

标签: collections plsql oracle11g bulkinsert forall

我有以下收集声明

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;

我的问题是,

  1. 一旦我删除了特定元素,就会自动调整集合,即索引i将被下一个元素替换,或者该特定索引将保持为空/无效,如果我在其中使用它可能会给我异常FORALL INSERT / UPDATE?

  2. 我不认为我可以将TABLE_1%ROWTYPE对象传递给一个过程,我是否必须创建一个记录类型?

  3. 关于管理公牛删除/更新/插入集合的任何其他提示将不胜感激。记住,我将处理2个表,如果我在table_1中插入/更新,那么这意味着我将从table_2中删除它,反之亦然。

1 个答案:

答案 0 :(得分:2)

鉴于TABLE_1.KEY是唯一的,您可以考虑将其用作关联数组的索引。这样,您可以使用KEY值从集合中删除,根据伪代码在执行删除时可以使用该值。这也可以节省你不得不遍历表来找到你想要的KEY,因为KEY将是索引 - 所以你的“删除”伪代码将成为:

tbl1_u.delete(key);

回答你的问题:

  1. 由于您正在使用关联数组,因此删除元素时,集合中没有“空”空间。但是,元素的索引实际上并没有改变。因此,您需要使用collection.PRIOR and collection.NEXT方法循环遍历集合。但同样,如果您使用KEY值作为索引,则可能根本不需要遍历集合。

  2. 您可以将TABLE_1%ROWTYPE作为参数传递给PL / SQL过程或函数。

  3. 您可能需要考虑使用MERGE语句,该语句可以在一个步骤中处理插入和更新。这可能允许您只维护一个集合。可能值得一试。

  4. 分享并享受。