powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Из ORACLE в DB2: чем заменить PIPELINED-функцию
17 сообщений из 17, страница 1 из 1
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #36770087
s390
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Прорабатывается вопрос переезда с 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
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #36771682
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ж
...
Рейтинг: 0 / 0
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #36772715
s390
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mustaccio
Большое спасибо.
...
Рейтинг: 0 / 0
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37101982
EFyodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этим не заменишь, потому что unnest работает только с переменной типа массив, т.е. перед вызовом unnest массив должен быть уже сформирован, поэтому если набор строк получается приличный - это будет кушать память, а если очень приличный - вобще не работать.

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

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

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

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

Либо покажите для примера, где такие функции у вас используются.
Может быть, удастся обойтись без них...
...
Рейтинг: 0 / 0
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37102734
EFyodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37103040
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно не спец ни в оракле ни в дб2, но идея иметь репозиторий кода на два совершенно разных сервера кажется несколько смелой, если не сказать утопичной. Хотя конечно могу и ошибаться. В люом случае - удачи!
...
Рейтинг: 0 / 0
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37103220
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EFyodorPIPELINED-функции используюсяв как источники для отчётов, потому что iReport в ранних версиях не мог получать набор из реф курсоров, т.е. понимал только селекты из таблиц, поэтому чтобы не плодить временные таблицы на каждый отчёт, использовались PIPELINED-функции, что позволило использовать их напрямую в селектах в iReport.

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

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

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

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

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

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

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

Вопрос pipelined снимается.
...
Рейтинг: 0 / 0
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37646914
db2unnest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37646984
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Из ORACLE в DB2: чем заменить PIPELINED-функцию
    #37647010
db2unnest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, спсб.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Из ORACLE в DB2: чем заменить PIPELINED-функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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