Във вашата TEST процедура имате v
деклариран като OUT параметър - това означава, че процедурата трябва да инициализира изходната колекция в процедурата (напр. v := T();
). Дори ако промените извикващия блок, за да инициализирате u_t
това няма да помогне, тъй като u_t
колекцията не се предава на процедурата - тя получава само това, което процедурата предава обратно.
Променете кода си, както следва:
CREATE OR REPLACE PROCEDURE TEST ( u IN T, v OUT T) IS
i NUMBER := u.FIRST;
BEGIN
v := T();
v.EXTEND(u.COUNT);
IF i IS NOT NULL THEN
LOOP
v(i) := u(i);
i := u.NEXT(i);
EXIT WHEN i IS NULL;
END LOOP;
END IF;
END TEST;
DECLARE
v_t T;
u_t T;
BEGIN
v_t := T();
v_t.EXTEND(2);
v_t(1) := 'This is test1';
v_t(2) := 'This is test2';
TEST(v_t, u_t);
FOR i IN u_t.FIRST..u_t.LAST LOOP
DBMS_OUTPUT.PUT_LINE(u_t(i));
END LOOP;
END;
Моля, обърнете внимание, че низовите константи в PL/SQL трябва да бъдат затворени в единични, а не в двойни кавички.
Също така - използването на подобни имена на променливи, които имат противоположни значения в процедурата и извикващия блок, само добавя към объркването. Създайте си навик да използвате смислени имена и ще си спестите много объркване по-късно.
Споделяйте и се наслаждавайте.