In je TEST-procedure heb je v
gedeclareerd als een OUT-parameter - dit betekent dat de procedure de uitvoerverzameling in de procedure moet initialiseren (bijv. v := T();
). Zelfs als u het aanroepende blok wijzigt om u_t
te initialiseren dit zal niet helpen, aangezien de u_t
collectie wordt niet doorgegeven aan de procedure - het ontvangt alleen wat de procedure weer uitgeeft.
Wijzig uw code als volgt:
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;
Houd er rekening mee dat stringconstanten in PL/SQL tussen enkele aanhalingstekens moeten staan, niet tussen dubbele aanhalingstekens.
Ook - het gebruik van vergelijkbare variabelenamen die tegengestelde betekenissen hebben in de procedure en het aanroepende blok draagt alleen maar bij aan de verwarring. Maak er een gewoonte van om betekenisvolle namen te gebruiken en u bespaart uzelf later veel verwarring.
Deel en geniet.