Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections pl/sql中的嵌套表元素赋值_Collections_Plsql_Oracle11g - Fatal编程技术网

Collections pl/sql中的嵌套表元素赋值

Collections pl/sql中的嵌套表元素赋值,collections,plsql,oracle11g,Collections,Plsql,Oracle11g,我在pl/sql嵌套表中的要求如下: 我声明了一个嵌套表集合类型,并根据表中的查找填充元素。 如果查找为代码生成多行多个值,则在嵌套表中添加所有这些多个值并继续。这就是我被困的地方。 我无法增加异常中的父计数器indx来处理这些多行。因为我不是,所以它只存储嵌套表中的最新数据,而不是所有数据 declare TYPE final_coll_typ IS TABLE OF varchar2(100); l_final_coll final_coll_typ; MULTI_FETCH EXCEP

我在pl/sql嵌套表中的要求如下:

我声明了一个嵌套表集合类型,并根据表中的查找填充元素。 如果查找为代码生成多行多个值,则在嵌套表中添加所有这些多个值并继续。这就是我被困的地方。 我无法增加异常中的父计数器indx来处理这些多行。因为我不是,所以它只存储嵌套表中的最新数据,而不是所有数据

declare
TYPE final_coll_typ IS TABLE OF varchar2(100);

l_final_coll final_coll_typ;

MULTI_FETCH EXCEPTION;
PRAGMA EXCEPTION_INIT(MULTI_FETCH, -1422); -- this is an ora error for exact fetch returns more than the required number of rows

begin

for indx in 1..<count> loop

    <some processing logic here>
    select code into l_final_coll(indx) from lookup_tbl where <some filter>;
    exception
    when MULTI_FETCH then
             for p in (select code from lookup_tbl where <some filter>)
             loop
                            l_final_coll(indx) := p.code;
                            dbms_output.put_line(l_final_coll(indx));
                        end loop;
                        continue; -- this is for further processing after the loop

end loop;
end;
比方说,计数器indx的第一次迭代只为代码生成了一行数据。存储在l_final_collindx中。 假设indx i的下一次迭代主for循环为代码生成2行值。我的想法是捕获异常ORA-01422,并在现有嵌套表中不断添加这两个代码值

因此,实际上,我的嵌套表的元素中现在应该有3个代码值。但是,目前,我只能让它填充其中的两个:第一次迭代的单个值和下一次迭代的最新值

任何关于我如何能做到这一点的建议都将不胜感激


PS:尝试操作计数器变量indx和p。但是,pl/sql显然不允许它用于for循环。

您根本不需要执行单个选择,只需使用游标循环开始,并附加到必须初始化的集合:

declare
  type final_coll_typ is table of varchar2(100);
  l_final_coll final_coll_typ;
begin
  l_final_coll := final_coll_typ();
  for indx in 1..<count> loop

    <some processing logic here>

    for p in (select code from lookup_tbl where <some filter>) loop
      l_final_coll.extend(1);
      l_final_coll(l_final_coll.count) := p.code;
    end loop;
  end loop;

  dbms_output.put_line('Final size: ' || l_final_coll.count);
end;
/
。。。然后使用特定计数器和过滤器:

declare
  type final_coll_typ is table of varchar2(100);
  l_final_coll final_coll_typ;
begin
  l_final_coll := final_coll_typ();
  for indx in 1..3 loop  
    for p in (select code from lookup_tbl where code = 'Code ' || indx) loop
      l_final_coll.extend(1);
      l_final_coll(l_final_coll.count) := p.code;
    end loop;
  end loop;

  dbms_output.put_line('Final size: ' || l_final_coll.count);
end;
/
declare
  type final_coll_typ is table of varchar2(100);
  l_final_coll final_coll_typ;
  l_tmp_coll sys.dbms_debug_vc2coll;
begin
  l_final_coll := final_coll_typ();
  for indx in 1..3 loop

    select code bulk collect into l_tmp_coll
    from lookup_tbl where code = 'Code ' || indx;

    for cntr in 1..l_tmp_coll.count loop
      l_final_coll.extend(1);
      l_final_coll(l_final_coll.count) := l_tmp_coll(cntr);
    end loop;
  end loop;

  dbms_output.put_line('Final size: ' || l_final_coll.count);
end;
/
。。。我得到:

anonymous block completed
Final size: 4
作为一个稍微复杂一点的选项,您可以将所有匹配的数据批量收集到一个临时集合中,然后在该集合上循环以将这些值附加到实际集合中。比如:

declare
  type final_coll_typ is table of varchar2(100);
  l_final_coll final_coll_typ;
  l_tmp_coll sys.dbms_debug_vc2coll;
begin
  l_final_coll := final_coll_typ();
  for indx in 1..<count> loop

    <some processing logic here>

    select code bulk collect into l_tmp_coll from lookup_tbl where <some filter>;

    for cntr in 1..l_tmp_coll.count loop
      l_final_coll.extend(1);
      l_final_coll(l_final_coll.count) := l_tmp_coll(cntr);
    end loop;
  end loop;
end;
/
。。。我再次得到:

anonymous block completed
Final size: 4

谢谢你给我这么多选择。你给的第一个选择很好…不知道为什么我没有想到它…呸!
anonymous block completed
Final size: 4