Vâng, đúng vậy. Bạn cần bọc các cột của mình trong hàm tạo của đối tượng và sử dụng BULK COLLECT
trong SELECT
tuyên bố:
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;
Ngoài ra, bạn cũng cần đảm bảo rằng bạn tạo đặc tả đối tượng, không chỉ phần thân (như trong ví dụ của bạn).
Các cột trong SELECT
phải theo thứ tự như chúng được tìm thấy trong phương thức khởi tạo của đối tượng. Nếu bạn chưa xác định rõ ràng một phương thức khởi tạo, một phương thức xây dựng tồn tại rõ ràng với mỗi cột theo thứ tự được khai báo trong đặc tả.
Nhược điểm duy nhất của việc sử dụng chức năng này là số lượng hàng lớn sẽ dẫn đến việc sử dụng nhiều bộ nhớ. Nếu bạn muốn sử dụng điều này để xử lý một số lượng lớn hàng, bạn nên sử dụng vòng lặp với LIMIT
mệnh đề.
Có thể chỉ định một phương thức khởi tạo rõ ràng, ngoài danh sách cột được tìm thấy trong đặc tả. Hàm tạo có thể có bất kỳ đầu vào nào bạn xác định, vì vậy, rõ ràng, khi bạn sử dụng một hàm tạo rõ ràng, bạn phải tuân theo danh sách đối số của nó. Đây là một ví dụ:
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;