Dans votre procédure TEST vous avez v
déclaré en tant que paramètre OUT - cela signifie que la procédure doit initialiser la collection de sortie dans la procédure (par exemple, v := T();
). Même si vous modifiez le bloc d'appel pour initialiser u_t
cela n'aidera pas, car le u_t
la collection n'est pas transmise à la procédure - elle ne reçoit que ce que la procédure renvoie.
Modifiez votre code comme suit :
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;
Veuillez noter que les constantes de chaîne en PL/SQL doivent être placées entre guillemets simples et non entre guillemets doubles.
De plus, l'utilisation de noms de variables similaires qui ont des significations opposées dans la procédure et le bloc d'appel ne fait qu'ajouter à la confusion. Prenez l'habitude d'utiliser des noms significatifs et vous éviterez bien des confusions plus tard.
Partagez et profitez.