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
格式。