En su procedimiento de PRUEBA tiene v
declarado como un parámetro OUT - esto significa que el procedimiento necesita inicializar la colección de salida en el procedimiento (por ejemplo, v := T();
). Incluso si cambia el bloque de llamada para inicializar u_t
esto no ayudará, ya que u_t
la colección no se pasa al procedimiento; solo recibe lo que el procedimiento devuelve.
Cambie su código de la siguiente manera:
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;
Tenga en cuenta que las constantes de cadena en PL/SQL deben estar entre comillas simples, no entre comillas dobles.
Además, el uso de nombres de variables similares que tienen significados opuestos en el procedimiento y el bloque de llamada solo aumenta la confusión. Adquiera el hábito de usar nombres significativos y se ahorrará mucha confusión más adelante.
Comparte y disfruta.