“参考未初始化的集合”

时间:2016-06-03 10:57:55

标签: plsql

我想显示两个日期之间输出的所有日期,这两个日期作为包的输入。

这是我的包裹:

    CREATE OR REPLACE PACKAGE PKG_NETORSONTECH
    AS
      TYPE ARRAY1 IS TABLE OF DATE;
      PROCEDURE PRINT_DATES (START_DATE VARCHAR2, END_DATE VARCHAR2);
    END PKG_NETORSONTECH;

这是我的包裹身体

CREATE OR REPLACE PACKAGE BODY PKG_NETORSONTECH
AS

  FUNCTION CALC_DATES (START_DATE DATE, END_DATE DATE)
  RETURN ARRAY1
  AS
  A1 ARRAY1;
  COUNTER NUMBER := 1;
  X DATE;
  BEGIN
  X := START_DATE;
  LOOP
  A1(COUNTER) := X;
  X := X + 1;
  COUNTER := COUNTER + 1;
  EXIT WHEN X = END_DATE;
  END LOOP;
  RETURN A1;
  END CALC_DATES;

  PROCEDURE PRINT_DATES (START_DATE VARCHAR2, END_DATE VARCHAR2)
  AS
  A2 ARRAY1;
  BEGIN

  A2 := CALC_DATES(TO_DATE(START_DATE,'DD/MM/YYYY'), TO_DATE(START_DATE,'DD/MM/YYYY'));

  FOR X IN A2.FIRST..A2.LAST
  LOOP
  DBMS_OUTPUT.PUT_LINE(A2(X));
  END LOOP;

  END PRINT_DATES;

END PKG_NETORSONTECH;

这是我的执行输入:

EXEC PKG_NETORSONTECH.PRINT_DATES('09/APR/2010', '12/DEC/2010');

当我执行此代码时,它会出现以下错误

   EXEC PKG_NETORSONTECH.PRINT_DATES('09/APR/2010', '12/DEC/2010')
    Error report -
    ORA-06531: Reference to uninitialized collection
    ORA-06512: at "BMAHAJAN.PKG_NETORSONTECH", line 13
    ORA-06512: at "BMAHAJAN.PKG_NETORSONTECH", line 26
    ORA-06512: at line 1
    06531. 00000 -  "Reference to uninitialized collection"
    *Cause:    An element or member function of a nested table or varray
               was referenced (where an initialized collection is needed)
               without the collection having been initialized.
    *Action:   Initialize the collection with an appropriate constructor
               or whole-object assignment.

1 个答案:

答案 0 :(得分:0)

在使用集合变量(或任何TYPE)之前,您必须通过调用其构造函数来初始化它。

在这里,在使用A1开始循环之前,必须通过 -

调用构造函数
A1 := new Array1();

这将创建一个包含0个元素的空数组,并将其分配给变量。新关键字是可选的。

由于这是一个嵌套的表类型而不是关联数组,因此您还必须根据集合中有多少元素为集合调用.EXTEND

如果你知道集合中会有x个元素,你可以这样做 -

A1.EXTEND(x); 

如果您不知道元素的数量,可以调用 -

A1.EXTEND;

在循环内部,为该循环的每次迭代添加一个新元素到集合中。