Oracle
 sql >> база данни >  >> RDS >> Oracle

Конвейерна функция, извикваща друга конвейерна функция

Смисълът на конвейерните функции е да захранват функциите TABLE(). Не мисля, че има начин да го избегнем. За съжаление трябва да присвоим изхода му на PL/SQL променлива. Не можем да присвоим конвейерна функция на вложена таблица като тази nt := more_rows; поради

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

Така че SELECT ... FROM TABLE() трябва да бъде.

Имам малко по-различно решение за вашето внимание. Не знам дали решава основния ви проблем.

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

Както съм сигурен, че знаете (но в полза на други търсачи), синтаксисът MULTISET UNION за събиране на колекции заедно беше въведен в Oracle 10g.

Тази версия на GO() произвежда същия резултат като първоначалната ви реализация:

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. Oracle ORA-01008:не всички променливи са обвързани Грешка с параметри

  2. Мрежовият адаптер не можа да установи връзката при свързване с Oracle DB

  3. Как да използвате Oracle DMP файлове?

  4. Поддържане на база данни на приложения агностична (ADO.NET срещу капсулираща логика на DB)

  5. Извикване на Oracle PL SQL функция от Excel VBA