sql >> Database teknologi >  >> RDS >> Oracle

Pipelinet funktion kalder en anden pipelinet funktion

Pointen med pipelinede funktioner er at føde TABLE()-funktioner. Jeg tror ikke, der er nogen måde at undgå det på. Desværre er vi nødt til at tildele dens output til en PL/SQL-variabel. Vi kan ikke tildele en pipelinet funktion til en indlejret tabel som denne nt := more_rows; på grund af

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

SELECT ... FROM TABLE() det skal være.

Jeg har en lidt anden løsning til din overvejelse. Jeg ved ikke, om det løser dit underliggende problem.

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

Som jeg er sikker på du er klar over (men til gavn for andre søgende) blev MULTISET UNION-syntaksen for glomming-samlinger sammen introduceret i Oracle 10g.

Denne version af GO() producerer det samme output som din oprindelige implementering:

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

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

8 rows selected.

SQL>


  1. log4net-logningsfejl i mysql-databaselogning

  2. Opret en ny tabel fra magento modul

  3. Sådan defineres et usigneret heltal i SQLAlchemy

  4. Bash-script til at indsætte værdier i MySQL