In Ihrem TEST-Verfahren haben Sie v
als OUT-Parameter deklariert - dies bedeutet, dass die Prozedur die Ausgabesammlung in der Prozedur initialisieren muss (z. B. v := T();
). Auch wenn Sie den aufrufenden Block ändern, um u_t
zu initialisieren das wird nicht helfen, da u_t
-Sammlung wird nicht an die Prozedur übergeben – sie erhält nur das, was die Prozedur zurückgibt.
Ändern Sie Ihren Code wie folgt:
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;
Bitte beachten Sie, dass String-Konstanten in PL/SQL in einfache Anführungszeichen eingeschlossen werden müssen, nicht in doppelte Anführungszeichen.
Außerdem - die Verwendung ähnlicher Variablennamen, die in der Prozedur und dem aufrufenden Block entgegengesetzte Bedeutungen haben, trägt nur zur Verwirrung bei. Gewöhnen Sie sich an aussagekräftige Namen und ersparen Sie sich später viel Verwirrung.
Teilen und genießen.