W Twojej procedurze TEST masz v
zadeklarowany jako parametr OUT - oznacza to, że procedura musi zainicjować zbiór danych wyjściowych w procedurze (np. v := T();
). Nawet jeśli zmienisz blok wywołujący, aby zainicjować u_t
to nie pomoże, ponieważ u_t
kolekcja nie jest przekazywana do procedury - otrzymuje tylko to, co z powrotem przekazuje procedura.
Zmień swój kod w następujący sposób:
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;
Zwróć uwagę, że stałe łańcuchowe w PL/SQL muszą być ujęte w pojedyncze cudzysłowy, a nie podwójne cudzysłowy.
Również - używanie podobnych nazw zmiennych, które mają przeciwne znaczenia w procedurze i bloku wywołującym tylko zwiększa zamieszanie. Nabierz nawyku używania znaczących nazw, a oszczędzisz sobie później wielu nieporozumień.
Dziel się i ciesz.