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

Hàm PIPELINED lồng nhau

Các hàm của bạn đang trả về data_type_1 và bộ sưu tập bảng cũng đang cố gắng tiêu thụ điều đó. Nhưng cả hai đều cần một loại tập hợp, ngay cả khi bạn mong đợi chúng chỉ trả về một giá trị duy nhất (trong trường hợp đó không có nhiều điểm tổng hợp). Bạn không thể phân phối trực tiếp loại bộ sưu tập, bạn phân phối thành viên của bộ sưu tập. Vì vậy, data_type_1 phải là một kiểu vô hướng hoặc đối tượng / bản ghi và bạn cần một kiểu khác là tập hợp những thứ đó.

create type data_type_1 as object (x number, y number)
/

create type table_type_1 as table of data_type_1
/

create or replace package xyz AS
  function main_xyz return table_type_1 pipelined;
  function sub_func return table_type_1 pipelined;
  function sub_func1 return table_type_1 pipelined;
end xyz;
/

create or replace package body xyz as
  function main_xyz return table_type_1 pipelined is
  begin 
    --code
    for rec in (select * from table(sub_func)) loop
      pipe row(data_type_1(rec.x, rec.y));
    end loop;
    for rec in (select * from table(sub_func1)) loop
      pipe row(data_type_1(rec.x, rec.y));
    end loop;
  end;

  function sub_func return table_type_1 pipelined is
    def data_type_1;
  begin 
    --code
    pipe row(def); --def is data_type_1
  end sub_func;

  function sub_func1 return table_type_1 pipelined is
    abc data_type_1;
  begin 
    --code
    loop
      pipe row (abc); --abc is data_type_1
    end loop;
  end sub_func1;
end xyz;
/

Vì vậy, tôi đã thêm một loại bảng của data_type_1 hiện có của bạn và thay đổi định nghĩa hàm để trả về loại bảng đó thay thế. pipe row vẫn sử dụng data_type_1 - mỗi là một hàng trong loại bảng. Vòng lặp của bạn cần một truy vấn cho con trỏ của nó, không phải một lệnh gọi trực tiếp đến table() , vì vậy tôi cũng đã thay đổi điều đó. Và hàng ống dẫn pipe row(sub_func); cũng cần phải là một vòng lặp tương tự trên một truy vấn.

Bạn chỉ gắn thẻ này là PL / SQL nhưng vì bạn có thể định gọi main_xyz từ SQL thuần túy và vì bạn đang gọi các hàm con từ ngữ cảnh SQL trong các vòng lặp đó, data_type_1table_type_1 cần được tạo ở cấp lược đồ hơn là trong PL / SQL. (Điều này đã thay đổi một chút trong 12c nhưng không đủ để giúp ở đây).

Nếu bạn muốn có chúng dưới dạng các kiểu PL / SQL, được khai báo trong đặc tả gói, thì bạn không thể gọi hàm từ ngữ cảnh không phải PL / SQL và bạn phải thay thế các vòng lặp bằng lệnh gọi hàm tiếp theo là một lần lặp lại bộ sưu tập đã trả lại.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giới thiệu về phương pháp thu thập PL / SQL trong cơ sở dữ liệu Oracle

  2. Oracle REGEXP_SUBSTR đến SUBSTR + INSTR

  3. Có thể sử dụng ứng dụng khách oracle 11g với máy chủ 10g không?

  4. Tham gia chéo trong Oracle

  5. Tại sao tôi bi quan Khóa JPA với Oracle không hoạt động