Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Có thể thực hiện chọn vào bảng của loại đối tượng không?

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa số giờ trùng lặp khỏi số ngày không làm việc

  2. Cách tính tuổi theo năm, tháng và ngày bằng Oracle

  3. Thiết kế con dành cho cha mẹ để dễ dàng xác định loại con

  4. Tham số ngày PL / SQL động với giá trị thời gian được giữ lại

  5. Cách nhập dữ liệu excel vào bảng Toad 9.5