Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja potokowa wywołująca inną funkcję potokową

Celem funkcji potokowych jest zasilanie funkcji TABLE(). Myślę, że nie ma sposobu, aby tego uniknąć. Niestety musimy przypisać jego wyjście do zmiennej PL/SQL. Nie możemy przypisać funkcji potokowej do tabeli zagnieżdżonej, takiej jak ta nt := more_rows; z powodu

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

Więc SELECT ... FROM TABLE() tak musi być.

Mam do rozważenia nieco inne rozwiązanie. Nie wiem, czy to rozwiązuje twój podstawowy 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; 
/

Jak na pewno wiecie (ale z korzyścią dla innych poszukiwaczy), składnia MULTISET UNION do wspólnych kolekcji glommingu została wprowadzona w Oracle 10g.

Ta wersja GO() generuje te same dane wyjściowe, co oryginalna implementacja:

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

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

8 rows selected.

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. oci_bind_by_name nie działa w PHP

  2. Łączenie z Oracle DB przez C

  3. Wstawianie klucza obcego z wieloma wartościami

  4. Metadane dotyczące typów rekordów na poziomie pakietu PL/SQL

  5. JDBC :pobierz typ tablicy z metadanych