首先:PL/SQL 集合不是基于 0 的。这将引发下标超出限制错误,因为您的计数器盯着 0。您也不需要此解决方案的计数器。如果您想继续使用它,请参阅第一个示例。但如果我是你,我会使用第二个例子。
其次,您在循环之前扩展了 varray。这将引发超出计数错误的下标,因为 varray 仅被扩展为容纳一行。您需要在循环开始时扩展它,以便在每次迭代时扩展 varray。
Thid,您不能PUT_LINE
使用整个 varray。您必须put_line
使用可变数组中的元素。所以在这个例子中,而不是dbms_output.put_line(x_varray_emp(i))
使用这个:dbms_output.put_line(x_varray_emp(i).ename || ' makes $' || x_varray_emp(i).sal)
第四:如果你的emp表中有超过14条记录,你VARRAY(14)
会导致下标超出限制错误。可变数组为它们设置了最大大小(有界限制),在您的情况下为 14。在此示例中,我将使用常规嵌套表 ( TYPE nested_emp IS TABLE OF emp_cur%ROWTYPE
),以免担心有界限制(从技术上讲,嵌套表具有最大 2147483647 又名 PLS_INTEGER)。如果您愿意在 VA 上使用 NT,请改用下面的第 3 个解决方案。
执行以下操作,它将起作用。
改变你v_counter NUMBER := 0
的v_counter NUMBER := 1
;
将 BODY 中的内容更改为:
BEGIN
FOR empRecs IN emp_Cur LOOP
x_varray_emp.EXTEND;
--Insert data into the varray
x_varray_emp(v_counter) := empRecs;
dbms_output.put_line(v_counter);
v_counter := v_counter + 1;
END LOOP;
--Loop through the varray and print out all the elements
FOR i IN x_varray_emp.FIRST .. x_varray_emp.LAST LOOP
dbms_output.put_line(x_varray_emp(i).ename || ' Makes $' || x_varray_emp(i).sal);
END LOOP;
END;
实际上,您不需要计数器。如果您愿意放弃它,请改用COUNT
varray 的方法:
BEGIN
FOR empRecs IN emp_Cur LOOP
x_varray_emp.EXTEND;
--Insert data into the varray
x_varray_emp(x_varray_emp.count) := empRecs;
dbms_output.put_line(x_varray_emp.count);
END LOOP;
--Loop through the varray and print out all the elements
FOR i IN x_varray_emp.FIRST .. x_varray_emp.LAST LOOP
dbms_output.put_line(x_varray_emp(i).ename || ' Makes $' || x_varray_emp(i).sal);
END LOOP;
END;
我希望您使用嵌套表来解决这个问题而不是可变数组。如果您愿意,这里是解决方案:
DECLARE
CURSOR emp_cur IS SELECT ename,sal FROM EMP;
TYPE nestedtable_emp IS TABLE OF emp_cur%ROWTYPE;
x_nestedtable_emp nestedtable_emp := nestedtable_emp();
BEGIN
FOR empRecs IN emp_Cur LOOP
x_nestedtable_emp.EXTEND;
--Insert data into the varray
x_nestedtable_emp(x_nestedtable_emp.count) := empRecs;
dbms_output.put_line(x_nestedtable_emp.count);
END LOOP;
--Loop through the varray and print out all the elements
FOR i IN x_nestedtable_emp.FIRST .. x_nestedtable_emp.LAST LOOP
dbms_output.put_line(x_varray_emp(i).ename || ' Makes $' || x_varray_emp(i).sal);
END LOOP;
END;