2013-07-23 54 views
0

我有以下声明集合与PL/SQL集合处理

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

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

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

TABLE_1.KEY是唯一的吗? –

+0

是的,Table_1.Key是唯一的 –

回答

2

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

tbl1_u.delete(key); 

回答您的问题:

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

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

  3. 您可能想要考虑使用MERGE语句来处理插入和更新操作。这可能会让您只保留一个集合。可能值得期待。

分享和享受。

+0

您可以详细说明如何通过键索引我的集合?其次,我插入集合基于array_index我收集每一个插入后保存。就像'tbl1_1(idx).key:= key;'然后是'idx:= idx + 1;'。现在你提到该索引不会改变,这不是说我的下一个插入数组会将我删除的索引留空,这可能导致在表中插入空值? –

+0

没关系,所以我想出了我的问题的第二部分......即我可以使用'所有我在table_1保存异常'语句的索引。现在你能否引用我的第一个问题,即使用key作为索引? –

+0

您的集合类型(T_TABLE1)是一个关联数组,由数值索引。关联数组与其他语言中的哈希表一样工作,因为“索引”就像数据库表上的索引 - 它是用于查找数据的关键字,而不是值列表中的物理偏移量。如果TABLE_1.KEY是一个数字,你可以用它作为这些关联数组的索引 - 所以你可以使用'tbl1_1(key).key:= key'。这意味着你不再需要'idx'。请参见[PL/SQL集合手册条目](http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#CHDEIDIC)。分享并享受。 –