如何将项目推送到数组并在PL / SQL中迭代它们?

时间:2014-09-25 12:25:57

标签: arrays oracle plsql

我正在尝试在PL / SQL中做一些非常基本的事情,但我一直在拥有......如何将项目推送到数组中并迭代它们?

谷歌搜索似乎建议使用owa_text.multi_line;

owa_text.multi_line是此类型的记录:

   /* A multi_line is just an abstract datatype which can hold */
   /* large amounts of text data as one piece.                 */
   type multi_line is record
   (
      rows        vc_arr,
      num_rows    integer,
      partial_row boolean
   );

要遍历vc_arr,我们必须使用l_array.first.. l_array.last。但是在尝试访问它时会出错。

这是一个简单的示例,可以将不同的值加载到数组中:

    declare
    l_persons owa_text.multi_line := owa_text.new_multi();
/* Documentation of owa_text.new_multi(): Standard "make element" routines. */
--function  new_multi return multi_line;

    l_value_exists boolean := false;

    cursor c_get_orders is
    select person,
             choice
    from my_orders;         

    begin
          for i in c_get_orders loop
                l_value_exists := false;
                for j in l_persons.rows.first.. l_persons.rows.last loop --Fails here, 
    --PL/SQL: numeric or value error
                          if l_persons.rows(j) = i.person then
                                l_value_exists := true;
                                exit;
                          end if;
                    end loop;
                    if not l_value_exists then
                          owa_text.add2multi(i.person, l_persons); 
                    end if; 
              end loop;
              for i in l_persons.rows.first.. l_persons.rows.last loop
                    write_to_log(l_persons.rows(i));
              end loop;
        end;

我错过了什么?我该怎么做?

编辑:这是一个设置的脚本,如果它有助于遵循示例:

create table my_orders
(
  person  varchar2(4000 byte),
  choice  varchar2(4000 byte)
);

insert into my_orders
   (person, choice)
 values
   ('Tom', 'Juice');
insert into my_orders
   (person, choice)
 values
   ('Jane', 'Apple');
insert into my_orders
   (person, choice)
 values
   ('Tom', 'Cake');
insert into my_orders
   (person, choice)
 values
   ('Jane', 'Chocolate');
insert into my_orders
   (person, choice)
 values
   ('Tom', 'Coffee');
commit;

2 个答案:

答案 0 :(得分:2)

Presumable,new_multi()方法初始化一个空集合。

Oracle集合的一个更深奥的功能是使用FIRST / LAST迭代空集合不起作用 - 您必须检查集合是否为空,或者使用{ {1}}代替:

1 .. <collection>.COUNT

<强>更新

有关迭代PL / SQL集合的技术的更全面说明,请参阅此OTN article by Steven Feuerstein

答案 1 :(得分:1)

必须是这样的:

declare
  l_persons owa_text.multi_line;
begin
  OWA_TEXT.new_multi (l_persons);
  FOR i IN 1 .. l_persons.num_rows
  loop
    null;
  end loop;
end;