Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Pipelined call pipelined / 8 сообщений из 8, страница 1 из 1
07.07.2017, 00:36
    #39484163
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
Доброго дня господа !

Как из 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
07.07.2017, 01:37
    #39484167
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call 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.
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
07.07.2017, 08:09
    #39484200
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
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
07.07.2017, 11:21
    #39484350
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
HOME_XМожет еще есть возможности ?перенаправить трубу из одной функции во вторую функцию без выфетчивания в первой функции курсора наподобие SELECT * FROM TABLE(MY_FUNC_1()) у Вас не выйдет
...
Рейтинг: 0 / 0
07.07.2017, 11:36
    #39484363
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
Pipelined "напрямую" сопрягаются на уровне запроса:
- union all (изолированные друг от друга pipelined)
- курсор как параметр pipelined

Это проистекает из того незамысловатого факта, что механизм обмена pipelined - суть попытка встроить процедурное расширение непосредственно в механизмы SQL-машины.
В обсуждаемом случае, возможно, следует говорить не о pipelined, а о табличных функциях, которые вызываются из pipelined-обертки.
...
Рейтинг: 0 / 0
07.07.2017, 11:45
    #39484373
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
andrey_anonymousВ обсуждаемом случае, возможно, следует говорить не о pipelined, а о табличных функцияхопасаюсь, в этом случае возможно ограничение по размеру. не?
...
Рейтинг: 0 / 0
07.07.2017, 12:00
    #39484394
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
А нужен именно 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
07.07.2017, 12:37
    #39484431
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pipelined call pipelined
andrey_anonymous- курсор как параметр pipelined


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

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

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

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


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


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