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

Làm cách nào để truy xuất các giá trị từ một thủ tục Oracle lồng nhau?

Có vẻ như bạn đang muốn hợp nhất một số SYS_REFCURSOR không xác định kết quả tập hợp thành một lớn. Nếu bạn biết cấu trúc của con trỏ được trả về từ spSelect_Inv_Search bạn có thể làm điều này với một hàm pipelined trung gian.

create package p as
    type tmp_rec_type is record (owner all_objects.owner%type,
        object_type all_objects.object_type%type,
        objects number);
    type tmp_rec_table is table of tmp_rec_type;

    procedure proc1(p_owner in varchar2, p_cursor out sys_refcursor);
    function func2 return tmp_rec_table pipelined;
    procedure proc3(p_cursor out sys_refcursor);
end;
/

Các kiểu có thể được xác định ở đây, chúng không nhất thiết phải ở cấp SQL vì bạn sẽ không bao giờ cần tham chiếu chúng bên ngoài gói.

create package body p as
    procedure proc1(p_owner in varchar2, p_cursor out sys_refcursor) as
    begin
        open p_cursor for select owner, object_type, count(*)
            from all_objects
            where owner = p_owner
            group by owner, object_type;
    end;

    function func2 return tmp_rec_table pipelined as
        cursor c1 is select distinct owner
            from all_tables where owner in ('SYS','SYSTEM');
        tmp_cursor sys_refcursor;
        tmp_rec tmp_rec_type;
    begin
        for r1 in c1 loop
            proc1(r1.owner, tmp_cursor);
            loop
                fetch tmp_cursor into tmp_rec;
                exit when tmp_cursor%notfound;
                pipe row(tmp_rec);
            end loop;
        end loop;
    end;

    procedure proc3(p_cursor out sys_refcursor) as
    begin
        open p_cursor for select * from table(func2);
    end;
end p;
/

Sau đó, để thực thi, mà bạn có thể thực hiện bên ngoài gói bất chấp các kiểu được sử dụng cho giai đoạn trung gian, bạn có thể thực hiện việc này để kiểm tra trong SQL * Plus hoặc SQL Developer:

var rc refcursor;
exec p.proc3(:rc);
print rc;

Đối với cơ sở dữ liệu của tôi, điều này mang lại:

OWNER                          OBJECT_TYPE         OBJECTS                
------------------------------ ------------------- ---------------------- 
SYSTEM                         VIEW                1                      
SYSTEM                         TABLE               5                      
SYS                            VIEW                1056                   
SYS                            CONSUMER GROUP      2                      
SYS                            PROCEDURE           11                     
SYS                            FUNCTION            56                     
SYS                            SEQUENCE            1                      
SYS                            OPERATOR            6                      
SYS                            EVALUATION CONTEXT  1                      
SYS                            TABLE               13                     
SYS                            WINDOW GROUP        1                      
SYS                            PACKAGE             162                    
SYS                            WINDOW              2                      
SYS                            TYPE                529                    
SYS                            JOB CLASS           1                      
SYS                            SCHEDULE            1     

Điều này rõ ràng là rất phức tạp vì bạn thực hiện điều này như một truy vấn đơn lẻ, nhưng tôi cho rằng thủ tục bên trong của bạn cần phải làm một cái gì đó phức tạp hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể thực hiện truy vấn sql

  2. Entity Framework kết nối với Oracle:ODP cho .NET không hỗ trợ thời gian

  3. ORA-01031:không đủ đặc quyền khi chọn chế độ xem

  4. tham số được phân tách bằng dấu phẩy trong thủ tục lưu trữ plsql

  5. Trừ số ngày cho một ngày trong PL / SQL