sql >> データベース >  >> RDS >> Oracle

ネストされたOracleプロシージャから値を取得するにはどうすればよいですか?

    不明な数のSYS_REFCURSORをマージしたいと考えているようです。 結果は1つの大きなものに設定されます。 spSelect_Inv_Searchから返されるカーソルの構造がわかっている場合 これは、中間のパイプライン関数を使用して実行できます。

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

    タイプはここで定義できます。パッケージの外部でタイプを参照する必要がないため、SQLレベルである必要はありません。

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

    次に、実行するために、中間段階で使用されるタイプに関係なくパッケージの外部で実行できます。これを実行して、SQL*PlusまたはSQLDeveloperでテストできます。

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

    私のデータベースの場合、これは次のようになります。

    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     
    

    これは単一のクエリとして実行するため、明らかに非常に工夫されていますが、内部プロシージャでさらに複雑な処理を実行する必要があると思います。



    1. 文字列の特定の部分で並べ替える方法は?

    2. キャプチャした画像をPythonとOpenCVを使用してMySQLデータベースに保存する

    3. テーブルの行をPHP配列とマージする方法は?

    4. 単一の外部SELECTクエリでSELECTサブクエリからの2つの集計値を使用する