sql >> Databáze >  >> RDS >> Oracle

Zřetězená funkce volá jinou zřetězenou funkci

Účelem zřetězených funkcí je podávání funkcí TABLE(). Myslím, že neexistuje způsob, jak se tomu vyhnout. Bohužel musíme jeho výstup přiřadit PL/SQL proměnné. Nemůžeme přiřadit zřetězenou funkci k vnořené tabulce, jako je tato nt := more_rows; kvůli

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

Takže SELECT ... FROM TABLE() musí být.

Mám pro vás trochu jiné řešení. Nevím, zda to vyřeší váš základní problém.

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 jsem si jistý, že jste si vědomi (ale ve prospěch ostatních hledajících), syntaxe MULTISET UNION pro glomming kolekce společně byla představena v Oracle 10g.

Tato verze GO() vytváří stejný výstup jako vaše původní implementace:

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

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

8 rows selected.

SQL>


  1. mysql opravit neplatná data

  2. Chyba SQL #1071 – zadaný klíč byl příliš dlouhý; maximální délka klíče je 767 bajtů

  3. Jak vybrat řádky s nejnovějším časem pro každé datum za posledních 30 dní ode dneška

  4. SYSDATETIME() vs GETDATE() v SQL Server:Jaký je rozdíl?