Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Из ORACLE в DB2: чем заменить PIPELINED-функцию / 17 сообщений из 17, страница 1 из 1
01.08.2010, 16:29
    #36770087
s390
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Добрый день.
Прорабатывается вопрос переезда с Oracle (10g) на DB2 (9.7) в режиме совместимости.
Натолкнулся на проблему переноса PIPELINED-функций. Есть код (и много) такого вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 TYPE my_type IS RECORD (
      ...
  );

  TYPE my_type_table IS TABLE OF my_type;

  ...
  
  FUNCTION func1(...) RETURN my_type_table PIPELINED
  IS
  BEGIN
     FOR v_row IN (...) LOOP
        PIPE ROW(v_row);
     END LOOP;
     RETURN;
  END func1;
Собственно вопрос распадается на две проблемы:
1. "TYPE my_type_table IS TABLE OF my_type" дает ошибку, хочет что бы обязательно был "INDEX BY".
2. Собственно PIPELINED-функция - ничего похожего в документации по DB2 не нашел.
Буду рад любой подсказке и наводке.
...
Рейтинг: 0 / 0
02.08.2010, 18:42
    #36771682
mustaccio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Два возможных решения:
- табличная функция (table function, http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0023363.html)
- функция UNNEST() для массива типа my_type_tableж
...
Рейтинг: 0 / 0
03.08.2010, 13:03
    #36772715
s390
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
mustaccio
Большое спасибо.
...
Рейтинг: 0 / 0
07.02.2011, 12:54
    #37101982
EFyodor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Этим не заменишь, потому что unnest работает только с переменной типа массив, т.е. перед вызовом unnest массив должен быть уже сформирован, поэтому если набор строк получается приличный - это будет кушать память, а если очень приличный - вобще не работать.

Я не нашёл ещё аналога оракловому PIPELINED в db2.
...
Рейтинг: 0 / 0
07.02.2011, 13:01
    #37102006
EFyodor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Табличные функции так же не решают проблему, потому что они требуют селект на выходу, а селект то делать неизчего, потому что строки набора формируются рунтайм и с помощью PIPELINED отправляются в результирующий набор.

В DB2 вариант пока, - использовать сессионные или глобальные временные таблицы. Наикривейшее решение....
...
Рейтинг: 0 / 0
07.02.2011, 13:09
    #37102029
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
EFyodor,

Все java / C табличные функции в db2 - pipelined по-оракловому.
...
Рейтинг: 0 / 0
07.02.2011, 16:20
    #37102524
EFyodor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Mark Barinstein,

Стоит задача портации c Oracle на DB2. Версия DB2 - 9.7. В этой версии IBM заявили о поддержке PLSQL. На практике я уже убедился какая это поддержка. Но задачи это не меняет, нужно портиторовать именно на PLSQL с мнимальным изменением кода. Т.е. переписывать на java или C нет возможности.
...
Рейтинг: 0 / 0
07.02.2011, 16:47
    #37102616
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
EFyodor... Т.е. переписывать на java или C нет возможности.Тогда используйте наикривейшее решение.
Кстати, а почему вы так считаете?

Либо покажите для примера, где такие функции у вас используются.
Может быть, удастся обойтись без них...
...
Рейтинг: 0 / 0
07.02.2011, 17:20
    #37102734
EFyodor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Mark Barinstein,

Требование: общий репозитарий. Т.е. исходный код должен копмилироваться на DB2, Oracle. Потому что не должен кардинально меняться регламент разработки(коммит изменений, выпуск патчей и т.п.).

PIPELINED-функции используюсяв как источники для отчётов, потому что iReport в ранних версиях не мог получать набор из реф курсоров, т.е. понимал только селекты из таблиц, поэтому чтобы не плодить временные таблицы на каждый отчёт, использовались PIPELINED-функции, что позволило использовать их напрямую в селектах в iReport.

В DB2 единственный вариант не переписывать все отчёты - это использовать табличные функции. Но, SQLPL и PLSQL в DB2 не поддерживают PIPELINED. В итоге я пока вижу переписывание PLSQL в части замены PIPELINED на временные таблицы, чтобы эти таблицы использовать в табличных функциях SQLPL. Это уже приводит к несовместимости кода, потмоу что в DB2 нет других возможностей использовать ввункцию в селекте, кроме как табличной функции, но табличные функции можно создать только на SQLPL, потому что оператор TABLE() в выражении селекта ругается при использовании PLSQL функции, которая возвращает коллекцию, хотя именно такие функции используются в селектах в Oracle c оператором TABLE(). Вот такая вот поддержа Oracle в DB2...

Поэтому ищу, но пока тупик.
...
Рейтинг: 0 / 0
07.02.2011, 19:20
    #37103040
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Я конечно не спец ни в оракле ни в дб2, но идея иметь репозиторий кода на два совершенно разных сервера кажется несколько смелой, если не сказать утопичной. Хотя конечно могу и ошибаться. В люом случае - удачи!
...
Рейтинг: 0 / 0
07.02.2011, 22:09
    #37103220
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
EFyodorPIPELINED-функции используюсяв как источники для отчётов, потому что iReport в ранних версиях не мог получать набор из реф курсоров, т.е. понимал только селекты из таблиц, поэтому чтобы не плодить временные таблицы на каждый отчёт, использовались PIPELINED-функции, что позволило использовать их напрямую в селектах в iReport.

А view уже отменили?

У ораклиного гуру Кайта вы можете видеть примерно такой список приоритетов:
* писать на SQL
* если невозможно - писать на PL/SQL
* если невозможно - писать на Java
* иначе - делать на C

Любопытно было бы посмотреть на код. Что там "а селект то делать неизчего, потому что строки набора формируются рунтайм". IBM для оправдания существования своих C и Java pipelined-функций ссылается на существование не-SQL-источников. Т.е., к внешнему файлу обратиться или http-запрос сделать. У вас ведь не тот случай? Я-то подозреваю, что у вас тот случай, когда люди пользуются возможностью, потому что она есть, тогда как от неё следовало бы воздержаться.
...
Рейтинг: 0 / 0
07.02.2011, 22:39
    #37103247
EFyodor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Victor Metelitsa,

view тут никак не помогут. Я же говорю, что данные нужны для отчётов. Почему вы думаете, что отчёты настолько простые, что можно обойтись view?

Если бы iReport(Jasper Report) поддерживал получение набора из функции или выходного параметра процедуры, этой проблемы вообще не было бы.
...
Рейтинг: 0 / 0
08.02.2011, 00:42
    #37103306
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Пожалуйста, покажите примеры (по мотивам ваших существующих функций). То, что, по-вашему, нельзя решить со VIEW.

Ну, рекурсия может потребовать не VIEW, а табличной функции на SQL PL - но это можно рассматривать как VIEW с передаваемыми внутрь теле VIEW параметрами.

Я знаю, что многосекционные запросы с WITH, аналитические функции ("Analytic Functions" по ораклячьи, "OLAP functions" по дибитовски) и рекурсия - творят настоящие чудеса. Мне интересно было бы узнать, почему они не помогут вам.
...
Рейтинг: 0 / 0
09.02.2011, 15:26
    #37107033
EFyodor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Доработал расширение для iReport. Теперь он умеет работать с выходными параметрами дибитушных процедур или функций типа REF CURSOR или CURSOR.

Вопрос pipelined снимается.
...
Рейтинг: 0 / 0
04.02.2012, 12:58
    #37646914
db2unnest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
mustaccioДва возможных решения:
- табличная функция (table function, http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.routines.doc/doc/c0023363.html)
- функция UNNEST() для массива типа my_type_tableж
Где можно подробнее посмотреть работу UNNEST с массивами сложных типов?
Например, массив элементов типа ROW:
create or replace type T_ROW as ROW ( r_name varchar(10), r_id integer );
create or replace type T_ARR as T_ROW array[];
или для асс.массивов:
TYPE T_REC IS RECORD ( r_name varchar(10), r_id integer );
TYPE T_ARR IS TABLE OF T_REC index by integer;

?
...
Рейтинг: 0 / 0
04.02.2012, 14:47
    #37646984
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
db2unnest,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace procedure test_unnest(p_rc int)
begin 
  declare l_arr T_ARR;
  declare c0 cursor with return for 
    select r_name, r_id from unnest(l_arr) t(r_name, r_id);

  for c1 as 
    with t(i) as (values 1 union all select i+1 from t where i<p_rc)
    select i from t
  do
    set l_arr[c1.i] = ('Name '||char(c1.i), c1.i);
  end for;

  open c0;
end
@

call test_unnest(10)
@
...
Рейтинг: 0 / 0
04.02.2012, 15:25
    #37647010
db2unnest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из ORACLE в DB2: чем заменить PIPELINED-функцию
Mark Barinstein, спсб.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Из ORACLE в DB2: чем заменить PIPELINED-функцию / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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