我想显示两个日期之间输出的所有日期,这两个日期作为包的输入。
这是我的包裹:
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.
答案 0 :(得分:0)
在使用集合变量(或任何TYPE
)之前,您必须通过调用其构造函数来初始化它。
在这里,在使用A1开始循环之前,必须通过 -
调用构造函数A1 := new Array1();
这将创建一个包含0个元素的空数组,并将其分配给变量。新关键字是可选的。
由于这是一个嵌套的表类型而不是关联数组,因此您还必须根据集合中有多少元素为集合调用.EXTEND
。
如果你知道集合中会有x个元素,你可以这样做 -
A1.EXTEND(x);
如果您不知道元素的数量,可以调用 -
A1.EXTEND;
在循环内部,为该循环的每次迭代添加一个新元素到集合中。