我这样写的,
CREATE PROCEDURE OR PROCEDURE varrtest
AS
 TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
 v_fieldlist FieldList;
BEGIN
  v_fieldlist(1):='AAAA';
  v_fieldlist(2):='BBB';
  v_fieldlist(3):='CCC';
  FOR v_i IN 1..3 LOOP
     DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
  END LOOP;
END;运行后抱错:
ERROR 位于第 1 行:
ORA-06531: Reference to uninitialized collection请问该如何呢?

解决方案 »

  1.   

    SQL> declare
      2  type t_varr is varray(21) of varchar2(2);
      3  v_varr t_varr:=t_varr(null);
      4  begin
      5  for i in 1..20 loop
      6  v_varr.extend;
      7  v_varr(i):=to_char(i);
      8  dbms_output.put_line(v_varr(i));
      9  end loop;
     10  end;
     11  /
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20PL/SQL procedure successfully completed
      

  2.   

    To  beckhambobo(beckham):
      请问,就我上面写的过程哪里错了??应该如何改呢?谢谢
      

  3.   

    数组需要初始化:
    CREATE PROCEDURE OR PROCEDURE varrtest
    AS
     TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
     v_fieldlist FieldList := FieldList('a','b','c'); -- 这里初始化
    BEGIN
      
      FOR v_i IN 1..3 LOOP
         DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
      END LOOP;
    END;或者你可以像楼上的那样,在定义时,构造数组为null,在循环中用方法extend,去扩充。
      

  4.   

    SQL> declare
      2  TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
      3  v_fieldlist FieldList:=FieldList('aaa','bbb','ccc');
      4  BEGIN
      5  
      6  FOR v_i IN 1..3 LOOP
      7       DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
      8  END LOOP;
      9  end;
     10  /
    aaa
    bbb
    ccc
      

  5.   

    sorry 
    改为以下语句
    v_varr t_varr:=t_varr();--构造没有元素
    而这里却存一个元素
    v_varr t_varr:=t_varr(null);--构造一个元素,为空.
      

  6.   

    To  beckhambobo(beckham)
         按照你说的改后,
         TYPE FieldList IS VARRAY(3) OF VARCHAR2(30)
          v_fieldlist FieldList:=FieldList();
          --或者v_fieldlist FieldList:=FieldList(NULL);
    其他不变,运行都抱错:
    ERROR 位于第 1 行:
    ORA-06533: Subscript beyond count我的目的是构造好数组后,在后面的过程中,根据不同情况给予不同的值。
    应该如何构造呢??谢谢
    我试了下如果写成v_fieldlist FieldList:=FieldList(1,2,3);运行就没错的,
    但是如果我要声明个50个的数组,难道要写(1,2,3,..50)么??
      

  7.   

    主要是需要对数组初始化,这样:
    FieldList := FieldList(); 
    FieldList.Extend(3); 3 是数组的大小,建议使用变量代替,这样更改数组大小时不必修改很多SQL语句。然后就可以利用for循环等对数组进行赋值操作了。当你想重新利用数组时,进行清空操作也只要调用上面两句即可。
      

  8.   

    你若嫌初始化麻烦,只好建议你用这个:
    type t_index_table is table of varchar2(1000) index by binary_integer.
    这个不需要初始化,直接用。下标从-2147483648到2147483648
      

  9.   

    TYPE FieldList IS VARRAY(3) OF VARCHAR2(30)
     v_fieldlist FieldList:=FieldList();--此处根本没有元素,若强行给数组赋值会错SQL> declare
      2   TYPE FieldList IS VARRAY(3) OF VARCHAR2(3);
      3   v_fieldlist FieldList:=FieldList('AAA','BBB','CCC');--构造没有元素的数组
      4  BEGIN
      5  FOR v_i IN 1..3 LOOP
      6       DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
      7  END LOOP;
      8  end;
      9  /
    AAA
    BBB
    CCC若有五十个元素,像我那样,用一个循环赋值.就以了.
    .....
    TYPE FieldList IS VARRAY(50) OF VARCHAR2(3);
    v_fieldlist FieldList:=FieldList();
    BEGIN
    FOR v_i IN 1..50 LOOP
    v_fieldlist.extend;
    v_fieldlist(v_i):=to_char(v_i);
    --DBMS_OUTPUT.PUT_LINE(v_fieldlist(v_i));
    END LOOP;
    ......
      

  10.   

    谢谢大家,再请问个
    如果我开始 TYPE FieldList IS VARRAY(50) OF VARCHAR2(3);
    构造时:FieldList := FieldList(); 
           FieldList.Extend(3);  就3个,
    这样会有什么不妥的地方么?
      

  11.   

    declare
    type t_varr is varray(20) of varchar2(2);
    v_varr t_varr:=t_varr();--构造空数组,没有元素
    begin
    v_varr.extend(20);--把20个null元素添加到表的末端
    for i in 1..20 loop
    v_varr(i):=to_char(i);
    dbms_output.put_line(v_varr(i));
    end loop;
    end;
    /