Dalam prosedur TEST Anda, Anda memiliki v
dideklarasikan sebagai parameter OUT - ini berarti bahwa prosedur perlu menginisialisasi kumpulan keluaran dalam prosedur (mis. v := T();
). Bahkan jika Anda mengubah blok panggilan untuk menginisialisasi u_t
ini tidak akan membantu, karena u_t
koleksi tidak diteruskan ke prosedur - hanya menerima apa yang dikembalikan oleh prosedur.
Ubah kode Anda sebagai berikut:
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;
Harap dicatat bahwa konstanta string dalam PL/SQL harus diapit oleh tanda kutip tunggal, bukan tanda kutip ganda.
Juga - menggunakan nama variabel serupa yang memiliki arti berlawanan dalam prosedur dan blok panggilan hanya menambah kebingungan. Biasakan menggunakan nama yang bermakna dan Anda akan terhindar dari banyak kebingungan nantinya.
Bagikan dan nikmati.