【问题标题】:Dealing with PL/SQL Collections处理 PL/SQL 集合
【发布时间】:2013-07-23 04:33:37
【问题描述】:

我有以下收集声明

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. 一旦我删除特定元素,将自动调整集合,即索引 i 将被下一个元素替换,或者该特定索引将保持为空/无效,如果我在全部插入/更新?

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

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

【问题讨论】:

  • TABLE_1.KEY 是唯一的吗?
  • 是的,Table_1.Key 是唯一的

标签: collections plsql oracle11g bulkinsert forall


【解决方案1】:

鉴于 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 语句,该语句可以一步完成插入和更新。这可能允许您只维护一个集合。可能值得研究。

分享和享受。

【讨论】:

  • 你能详细说明我如何按键索引我的收藏吗?其次,我根据在每次插入集合后保存的 array_index 插入集合。比如tbl1_1(idx).key := key;,然后是idx := idx + 1;。现在您提到索引不会改变,这是否意味着我在数组中的下一个插入将使我删除的索引为空,这可能导致表中的空插入?
  • 好的,所以我想出了问题的第二部分......即我可以使用forall i in indices of table_1 save exceptions 声明。现在你能详细说明我的第一个问题,即使用键作为索引吗?
  • 您的集合类型 (T_TABLE1) 是一个关联数组,由数值索引。关联数组的工作方式类似于其他语言中的哈希表,因为“索引”就像数据库表上的索引——它是用于查找数据的键,而不是值列表中的物理偏移量。如果 TABLE_1.KEY 是一个数字,您可以将其用作这些关联数组的索引 - 所以您可以使用 tbl1_1(key).key := key。这意味着您不再需要idx。见the manual entry on PL/SQL collections。分享和享受。
  • 至于“...这是否意味着我在数组中的下一个插入将使我删除的索引为空,这可能导致表中的空插入?” - 不。关联数组有点像链表——当你删除一个元素时,它就消失了,并且没有“空白空间”了。分享和享受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2017-04-30
  • 2016-01-26
相关资源
最近更新 更多