Em seu procedimento TEST você tem
v
declarado como um parâmetro OUT - isso significa que o procedimento precisa inicializar a coleção de saída no procedimento (por exemplo, v := T();
). Mesmo se você alterar o bloco de chamada para inicializar u_t
isso não ajudará, pois o u_t
coleção não é passada para o procedimento - ela apenas recebe o que o procedimento passa de volta. Altere seu código da seguinte forma:
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;
Observe que as constantes de string em PL/SQL devem ser colocadas entre aspas simples, não aspas duplas.
Além disso - usar nomes de variáveis semelhantes que têm significados opostos no procedimento e no bloco de chamada apenas aumenta a confusão. Adquira o hábito de usar nomes significativos e você evitará muita confusão mais tarde.
Compartilhe e curta.