sql >> Base de Datos >  >> RDS >> Oracle

Función canalizada llamando a otra función canalizada

El objetivo de las funciones canalizadas es alimentar funciones TABLE(). No creo que haya forma de evitarlo. Desafortunadamente, tenemos que asignar su salida a una variable PL/SQL. No podemos asignar una función segmentada a una tabla anidada como esta nt := more_rows; debido a

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

Así que SELECT ... FROM TABLE() tiene que ser.

Tengo una solución ligeramente diferente para su consideración. No sé si resuelve tu problema subyacente.

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

Como estoy seguro de que sabe (pero para el beneficio de otros buscadores), la sintaxis MULTISET UNION para combinar colecciones se introdujo en Oracle 10g.

Esta versión de GO() produce el mismo resultado que su implementación original:

SQL> select * from table( tq84_pipelined.go)
  2  /

COLUMN_VALUE
-------------------------
Mein
Name
ist
Eugen,
ich
weiss
von
nichts.

8 rows selected.

SQL>