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

別のパイプライン関数を呼び出すパイプライン関数

    パイプライン関数のポイントは、TABLE()関数にフィードすることです。それを回避する方法はないと思います。残念ながら、その出力をPL/SQL変数に割り当てる必要があります。このnt := more_rows;のように、パイプライン関数をネストされたテーブルに割り当てることはできません。

    PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
    

    したがって、SELECT ... FROM TABLE() しなければなりません。

    私はあなたの考慮のためにわずかに異なる解決策を持っています。それがあなたの根本的な問題を解決するかどうかはわかりません。

    create or replace package body tq84_pipelined as 
    
        function more_rows return tq84_line pipelined is 
        begin 
    
            pipe row('ist'); 
            pipe row('Eugen,'); 
    
            return; 
    
        end more_rows; 
    
        function go return tq84_line pipelined is 
            nt1 tq84_line;
            nt2 tq84_line;
            nt3 tq84_line;
            nt0 tq84_line;
        begin 
    
            nt1 := tq84_line('Mein','Name'); 
    
            select * 
            bulk collect into nt2
            from table(more_rows);
    
            nt3 := tq84_line('ich','weiss','von','nichts.'); 
    
            nt0 := nt1 multiset union nt2 multiset union nt3; 
    
            for i in nt0.first..nt0.last
            loop 
              pipe row(nt0(i)); 
            end loop; 
    
            return;
    
        end go; 
    
    end tq84_pipelined; 
    /
    

    ご存じのとおり(ただし、他のシーカーの利益のために)、コレクションをまとめてグロミングするためのMULTISETUNION構文がOracle10gで導入されました。

    このバージョンのGO()は、元の実装と同じ出力を生成します。

    SQL> select * from table( tq84_pipelined.go)
      2  /
    
    COLUMN_VALUE
    -------------------------
    Mein
    Name
    ist
    Eugen,
    ich
    weiss
    von
    nichts.
    
    8 rows selected.
    
    SQL>
    


    1. MySQL-COUNTがNULL行を返すように選択します

    2. MySQLで最後の削除コマンドをロールバックするにはどうすればよいですか?

    3. RawSQLクエリをLaravelEloquentに変換する

    4. Codeiginterでページネーションを作成するにはどうすればよいですか?