Plsql &引用;“对未初始化集合的引用”;

Plsql &引用;“对未初始化集合的引用”;,plsql,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 REPLAC

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

这是我的包裹:

    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.

在使用集合变量(或任何
类型
)之前,必须通过调用其构造函数对其进行初始化

在这里,在使用A1开始循环之前,必须通过以下方式调用构造函数-

A1 := new Array1();
这将创建一个包含0个元素的空数组,并将其分配给变量。新关键字是可选的

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

如果您知道集合中将有x个元素,则可以执行以下操作-

A1.EXTEND(x); 
如果您不知道元素的数量,可以调用-

A1.EXTEND;

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

仅观察
A2:=计算日期(到日期(开始日期,'DD/MM/YYYY')、到日期(开始日期,'DD/MM/YYYY')-1)您在此处同时使用开始日期,2)您使用的日期格式为
dd/mm/yyyy
,而您发送的数据为
dd/mmm/yyyy
格式。