powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Pipelined call pipelined
8 сообщений из 8, страница 1 из 1
Pipelined call pipelined
    #39484163
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Как из function Pipelined осуществить вызов (по сути передать управление) другой функции pipelined

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
create or replace type A1 as table of number;

create or replace type tA1 as object
(
  F1           number,
  member function Show(P1 number          ) return A1 pipelined,
  member function Show(P1 number,P2 number) return A1 pipelined
);

create or replace type body tA1 as

  member function Show(P1 Number) 
           return A1 pipelined
  as
  begin
    declare
      R A1;
    begin

/*
     -- R:=Show(P1,0);  --ошибка вызова PL/SQL не поддерживает вызов pipelined
      select * bulk collect into R from table(tA1(0).Show(P1,0));
      for I in R.First..R.Last loop
        pipe row(R(I));
      end loop;

     -- Данный  select + for  не нужен, управление вывода необходимо передать на Show(P1,P2)
*/

    end;
    return;
  end;

  member function Show(P1 Number,P2 Number) 
           return A1 pipelined
  as
  begin
    declare
      a number;
    begin
      for I in 1..P1+P2 loop
        pipe row(I);
      end loop;
    end;
    return;
  end;

end;


select *
  from table(tA1(0).Show(4,5));

select *
  from table(tA1(0).Show(10));



Зачем это нужно ?
- концентрация процессы обработки и вывода на одной процедуре
- для пользователя "НЕЗАМЕТНАЯ" передача разного числа параметров
(default не подходит - разное кол-во и типы параметров)

Заранее благодарен !
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484167
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
SQL> create or replace type tA1 as object
  2  (
  3    F1           number,
  4    member function Show(P1 number,P2 number := 0) return A1 pipelined
  5  );
  6  /

Type created.

SQL> create or replace type body tA1 as
  2    member function Show(P1 Number,P2 Number := 0)
  3             return A1 pipelined
  4    as
  5    begin
  6      declare
  7        a number;
  8      begin
  9        for I in 1..P1+P2 loop
 10          pipe row(I);
 11        end loop;
 12      end;
 13      return;
 14    end;
 15  end;
 16  /

Type body created.

SQL> select *
  2    from table(tA1(0).Show(4,5));

COLUMN_VALUE
------------
           1
           2
           3
           4
           5
           6
           7
           8
           9

9 rows selected.

SQL> select *
  2    from table(tA1(0).Show(10));

COLUMN_VALUE
------------
           1
           2
           3
           4
           5
           6
           7
           8
           9
          10

10 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484200
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYSY.

Спасибо , не совсем подходит
(default не подходит - разное кол-во и типы параметров)

В продуктиве вызовы следующие
Вариант 1 select * from table(tA1(0).Show('S1','S2','S3','S4',...................P18,P19,P20));
Вариант 2 select * from table(tA1(0).Show(To_Date('01-01-2017','DD-MM-YYYY'),3,'S1'));

Может еще есть возможности ?
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484350
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XМожет еще есть возможности ?перенаправить трубу из одной функции во вторую функцию без выфетчивания в первой функции курсора наподобие SELECT * FROM TABLE(MY_FUNC_1()) у Вас не выйдет
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484363
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pipelined "напрямую" сопрягаются на уровне запроса:
- union all (изолированные друг от друга pipelined)
- курсор как параметр pipelined

Это проистекает из того незамысловатого факта, что механизм обмена pipelined - суть попытка встроить процедурное расширение непосредственно в механизмы SQL-машины.
В обсуждаемом случае, возможно, следует говорить не о pipelined, а о табличных функциях, которые вызываются из pipelined-обертки.
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484373
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВ обсуждаемом случае, возможно, следует говорить не о pipelined, а о табличных функцияхопасаюсь, в этом случае возможно ограничение по размеру. не?
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484394
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нужен именно pipelined? Просто если
авторВ продуктиве вызовы следующие
Вариант 1 select * from table(tA1(0).Show('S1','S2','S3','S4',...................P18,P19,P20));
Вариант 2 select * from table(tA1(0).Show(To_Date('01-01-2017','DD-MM-YYYY'),3,'S1'));

и выходной тип в этой select * идентичный, то внутренности реализации можно через REFCURSOR передавать.
...
Рейтинг: 0 / 0
Pipelined call pipelined
    #39484431
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous- курсор как параметр pipelined


Так и реализовано, была хотелка упросить и не вызывать ненужного курсора

На текущий момент реализация следующая
Конструктор 1 - обрабатывает множество записей -> курсор-параметр -> общий pipelined - (норма !!)
Конструктор 2 - обрабатывает ОДНУ запись -> курсор-параметр -> общий pipelined - (искуств.й курсор !!)

Одна запись это 24 параметра конструктора преобразованные в курсор = select S1,S2,S3........P24 from DUAL
Не хотел создавать "искуствен." курсор, предполагал концентрацию основного расчета в одной функции и вызов
ее напрямую из select-а или из другого pipelined-а..

Ну если невозможно - то так тоже работает неплохо...


Спасибо за уделенное время
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Pipelined call pipelined
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]