Collections 处理PL/SQL集合

Collections 处理PL/SQL集合,collections,plsql,oracle11g,bulkinsert,forall,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循环中用于对表1进行插入或更新 现在可能有一些情况,我想删除某个元素。因此,我计划创建一个过程,该过程将获取密钥(唯一)并匹配元素(如果找到该密钥) psedou码 FOR i in tbl1

我有以下声明要收集

TYPE T_TABLE1 IS TABLE OF TABLE_1%ROWTYPE INDEX BY BINARY_INTEGER;
tbl1_u             T_TABLE1;
tbl1_i             T_TABLE1;
此表将不断增长,最后将在FORALL循环中用于对表1进行插入或更新

现在可能有一些情况,我想删除某个元素。因此,我计划创建一个过程,该过程将获取密钥(唯一)并匹配元素(如果找到该密钥)

psedou码

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将被下一个元素替换,或者该特定索引将保持空/无效,并且如果我在所有插入/更新中使用它,可能会给我异常

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

  • 如果您有任何关于管理bull delete/update/insert集合的其他提示,将不胜感激。请记住,我将处理2个表,如果我在表1中插入/更新,则意味着我将从表2中删除它,反之亦然

  • 假定TabelY1.KEY是唯一的,您可以考虑使用它作为关联数组的索引。这样,您就可以使用键值从集合中删除,根据伪代码,在执行删除操作时,键值是可用的。这还可以避免您必须在表中迭代以找到所需的键,因为键就是索引-因此您的“删除”伪代码将变成:

    tbl1_u.delete(key);
    
    回答您的问题:

  • 由于使用的是关联数组,因此删除元素时,集合中没有“空”空间。然而,元素的索引实际上并没有改变。因此,您需要使用这些方法在集合中循环。但是,如果使用键值作为索引,则可能根本不需要循环遍历集合

  • 您可以将表1%行类型作为参数传递给PL/SQL过程或函数

  • >P>您可能需要考虑使用一个合并语句,该语句可以在一个步骤中处理插入和更新。这可能只允许您维护一个集合。也许值得一看


    分享和享受

    TABLE_1.KEY是否唯一?是的,TABLE_1.KEY是否唯一?能否详细说明如何按KEY为我的收藏编制索引?其次,我将根据每次插入集合后保存的数组索引插入集合。类似于
    tbl1_1(idx)的soemthing。key:=key然后
    idx:=idx+1。现在您提到索引不会改变,这是否意味着我在数组中的下一次插入将使我删除的索引为空,这可能会导致表中的空插入?好的,所以我解决了问题的第二部分。。。i、 e.我可以在表1的索引中使用
    保存异常
    语句。现在您可以删除我的第一个问题,即使用键作为索引吗?您的集合类型(T_TABLE1)是一个关联数组,由一个数值索引。关联数组的工作方式与其他语言中的哈希表类似,因为“索引”类似于数据库表上的索引—它是用于查找数据的键,而不是值列表中的物理偏移量。如果TABLE_1.KEY是一个数字,您可以将它用作这些关联数组的索引-因此您可以执行
    tbl1_1(KEY)。KEY:=KEY
    。这意味着您不再需要
    idx
    。看见共享和享受。至于“…这是否意味着我在数组中的下一次插入将使我删除的索引为空,从而可能导致表中的空插入?”-不。关联数组有点像链表-当您删除一个元素时,它就消失了,并且没有“空白”了。分享和享受。