sql >> Databasteknik >  >> RDS >> Oracle

Pipelined funktion som anropar en annan pipelined funktion

Poängen med pipelineade funktioner är att mata TABLE()-funktioner. Jag tror inte det finns något sätt att undvika det. Tyvärr måste vi tilldela dess utdata till en PL/SQL-variabel. Vi kan inte tilldela en pipelined funktion till en kapslad tabell som denna nt := more_rows; på grund av

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

SELECT ... FROM TABLE() det måste vara.

Jag har en lite annorlunda lösning för dig. Jag vet inte om det löser ditt underliggande 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 jag är säker på att du är medveten om (men till förmån för andra sökare) introducerades MULTISET UNION-syntaxen för glommingsamlingar tillsammans i Oracle 10g.

Denna version av GO() producerar samma utdata som din ursprungliga implementering:

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

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

8 rows selected.

SQL>


  1. Finns det en Go Mysql-drivrutin som stöder flera satser inom en enda sträng?

  2. hur man kontrollerar strängen som finns i databaskolumnen?

  3. 4 sätt att skilja timmar, minuter och sekunder från ett tidsvärde i MariaDB

  4. PostgreSQL regexp_replace() för att bara behålla ett blanksteg