0

我有以下收集声明

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(唯一)并匹配元素

伪代码

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. 一旦我删除特定元素,集合会自动调整,即索引​​我将被下一个元素替换,或者该特定索引将保持为空/无效,如果我在 FORALL INSERT/UPDATE 中使用它可能会给我异常?

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

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

1 回答 1

2

鉴于 TABLE_1.KEY 是唯一的,您可能会考虑将其用作关联数组的索引。这样,您可以使用 KEY 值从集合中删除,根据伪代码,在执行删除时可以使用该值。这也将使您不必遍历表以查找所需的 KEY,因为 KEY 将是索引 - 因此您的“删除”伪代码将变为:

tbl1_u.delete(key);

要回答您的问题:

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

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

  3. 您可能需要考虑使用 MERGE 语句,该语句可以一步完成插入和更新。这可能允许您只维护一个集合。可能值得关注。

分享和享受。

于 2013-07-24T00:19:54.870 回答