sql >> Database >  >> RDS >> Oracle

Hoe haal ik waarden op uit een geneste Oracle-procedure?

Het lijkt erop dat u een onbekend aantal SYS_REFCURSOR . wilt samenvoegen resultaat sets in één grote. Als u de structuur kent van de cursor die wordt geretourneerd door spSelect_Inv_Search je kunt dit doen met een tussenliggende pijplijnfunctie.

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;
/

De typen kunnen hier worden gedefinieerd, ze hoeven niet op SQL-niveau te zijn, omdat u er nooit buiten het pakket naar hoeft te verwijzen.

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;
/

Om vervolgens uit te voeren, wat u buiten het pakket kunt doen, ondanks de typen die worden gebruikt voor de tussenfase, kunt u dit doen om te testen in SQL*Plus of SQL Developer:

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

Voor mijn database geeft dit:

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     

Dit is natuurlijk erg gekunsteld omdat je dit als een enkele vraag zou doen, maar ik neem aan dat je innerlijke procedure iets ingewikkelder moet doen.



  1. Controleer of de waarde bestaat voordat u deze in MySQL DB invoegt in een PHP-script

  2. Is MySQL beter bestand tegen SQL-injectieaanvallen dan PostgreSQL (onder Perl/DBI)?

  3. Vergelijkbare lengte- en breedtegraad uit de database halen

  4. PostgreSQL:rijen bijwerken in CTE