Ya itu. Anda perlu membungkus kolom Anda dalam konstruktor objek dan menggunakan BULK COLLECT
opsi di SELECT
pernyataan:
CREATE OR REPLACE TYPE t_some_type AS OBJECT(f varchar2(10))
/
CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
/
DECLARE
v_some_table t_some_table;
BEGIN
SELECT t_some_type (dummy)
BULK COLLECT INTO v_some_table
FROM DUAL;
END;
Selain itu, Anda juga perlu memastikan bahwa Anda membuat spesifikasi objek, bukan hanya badan (seperti pada contoh Anda).
Kolom di SELECT
harus dalam urutan yang sama seperti yang ditemukan di konstruktor objek. Jika Anda belum secara eksplisit mendefinisikan konstruktor, satu secara eksplisit ada dengan setiap kolom dalam urutan yang dinyatakan dalam spesifikasi.
Satu-satunya downside menggunakan fungsi ini adalah bahwa sejumlah besar baris akan menghasilkan penggunaan memori yang berat. Jika Anda berharap untuk menggunakan ini untuk memproses sejumlah besar baris, Anda harus menggunakan loop dengan LIMIT
klausa.
Dimungkinkan untuk menentukan konstruktor eksplisit, selain daftar kolom yang ditemukan dalam spesifikasi. Konstruktor dapat memiliki input apa pun yang Anda tetapkan, jadi, jelas, ketika Anda menggunakan konstruktor eksplisit, Anda harus mengikuti daftar argumennya. Ini contohnya:
CREATE OR REPLACE TYPE t_some_type AS OBJECT
(
f1 VARCHAR2 (10),
CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
RETURN SELF AS RESULT
);
/
CREATE OR REPLACE TYPE BODY t_some_type AS
CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
RETURN SELF AS RESULT IS
BEGIN
self.f1 := LPAD (p_value, p_length, p_value);
RETURN;
END t_some_type;
END;
/
CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
/
DECLARE
v_some_table t_some_table;
BEGIN
--Explicit Constructor
SELECT t_some_type (10, dummy)
BULK COLLECT INTO v_some_table
FROM DUAL;
DBMS_OUTPUT.put_line (v_some_table (1).f1);
--Implicit Constructor
SELECT t_some_type (dummy)
BULK COLLECT INTO v_some_table
FROM DUAL;
DBMS_OUTPUT.put_line (v_some_table (1).f1);
END;