powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопрос по хранимым табличным функциям
17 сообщений из 17, страница 1 из 1
Вопрос по хранимым табличным функциям
    #38256382
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, какую конструкцию языка можно использовать, чтобы вернуть функцией массив строк?
Функцию необходимо использовать в sql - поэтому modifies sql data использовать нельзя, соответственно, временные таблицы тоже.
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257090
Фотография Hunterik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257164
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hunterik,

угумс, уже чайник кипит от мозгового штурма...
проблема в том, что вернуть надо не результат select`а - результирующие данные фетчатся курсором и вычисляются, т.е. прежде чем их return`ить - их надо куда-то сложить.
Сейчас копаюсь в pipelined functions (ответьте хоть, там ли роюсь)?
и можно ли типы объявлять в самой функции или обязательно создавать их заранее пакетами?
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257189
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toshkin,

Если версия 9.7 или новее:
Код: sql
1.
2.
3.
4.
5.
  DECLARE ARR DBMS_OUTPUT.CHARARR;
  ...
  SET ARR[I] = ...; -- FETCH ... INTO ARR[I];
  ...
  RETURN SELECT STR FROM UNNEST(ARR) T(STR);
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257200
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

так это по одному полю, а если их много?
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257362
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toshkinтак это по одному полю, а если их много?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create type myrow as row (
  f1 data_type1
...
, fN data_typeN
)@

create type myrow_arr as myrow_arr ARRAY[]@

begin
  declare l_arr myrow_arr;
  ...
  set l_arr[i].f1 = ...;
  ...
  set l_arr[i].fN = ...;
  ...
  RETURN SELECT f1, ..., fN FROM UNNEST(l_arr) T(f1, ..., fN);
end@
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257681
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

не работает:

create type row_IV300 as row (f1 INTEGER, f2 VARCHAR(300))@


create type arr_IV300 as nftg.row_IV300 ARRAY[]@


create or replace function test()
returns table(f1 integer, f2 varchar(300))
begin atomic
declare i integer default 0;
declare mytab nftg.arr_IV300;
for curr as select id, name from agent
do
set i = i + 1;
set mytab[i].f1 = curr.id;
set mytab[i].f2 = curr.name;
end for;
return select f1, f2 from UNNEST(mytab) T(f1, f2);
end@

DB2 Database Error: ERROR [42601] [IBM][DB2/NT64] SQL0104N An unexpected token "set" was found following " set i = i + 1; ". Expected tokens may include: "WHILE". LINE NUMBER=9. SQLSTATE=42601
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257768
mm72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toshkin,

включите поддержку оракла и пишите на pl/sql.
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38257780
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mm72Toshkin,

включите поддержку оракла и пишите на pl/sql.

Так?

db2set DB2_COMPATIBILITY_VECTOR=ORA
db2stop
db2start

Включил, всё равно не работает.
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258220
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Toshkinне работает:
Код: sql
1.
2.
create type row_IV300 as row (f1 INTEGER, f2 VARCHAR(300))@
create type arr_IV300 as nftg.row_IV300 ARRAY[]@

...

Надо через промежуточную скалярную функцию, типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or replace function test_row()
returns arr_IV300
begin
  declare i integer default 0;
  declare mytab nftg.arr_IV300;
  for curr as select id, name from agent
  do
    set i = i + 1;
    set mytab[i].f1 = curr.id;
    set mytab[i].f2 = curr.name;
  end for;
  return select f1, f2 from UNNEST(mytab) T(f1, f2);
end@

create or replace function test()
returns table(f1 integer, f2 varchar(300))
return select f1, f2 from unnest(test_row())@
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258248
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Toshkin,

Марк, по-моему, ошибся.
DB2'шная дока как-то замалчивает, какие типы можно использовать в inlined compound SQL (какими обязаны быть табличные функции), а какие нет. Получается, что только build-in типы и ARRAY переменные тут не катят.
Про compiled всё расписано (там всё можно).

А что сделать то надо? Можно посмотреть на всю ф-ю целиком, как если бы эти ARRAYS там работали?
Вопрос о вычислительной полноте самого SQL, вроде, закрыт, так что всё в наших руках.
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258384
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На эту тему - http://tkyte.blogspot.ru/2006/10/slow-by-slow.html .

Обобщая: некоторые вещи вообще не стоило бы заводить, потому что они постоянно используются во вред. В том числе курсоры, массивы, временные таблицы, табличные SQL-функции, никнеймы, возможность на одном instance заводить несколько баз и т.д.
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258402
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Вот в таком виде это заработало:

create or replace function test_row()
returns nftg.arr_IV300
begin
declare i integer default 0;
declare mytab nftg.arr_IV300;
for curr as select id, name from agent
do
set i = i + 1;
set mytab[i].f1 = curr.id;
set mytab[i].f2 = curr.name;
end for;
return mytab;
end;

create or replace function test()
returns table(f1 integer, f2 varchar(300))
return select f1, f2 from unnest(nftg.test_row()) T(f1, f2)


НО! Запрос вернул только первые 504 записи из многих тысяч.
Можно как-то убрать это ограничение для массива или нужно искать другое решение?
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258409
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C PL/SQL разобрался - чтобы он заработал, после смены настроек сервера нужно создавать новую базу :(
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258425
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor Metelitsa,

Прочитайте мой второй пост. Мы разбираем здесь простой пример, который, конечно, можно решить гораздо проще, но реальная задача существенно сложнее.
Я перевожу базу с interbase на db2. Там около 1000 процедур. В качестве основы для перевода взят sqlways, но многое приходится допиливать руками. В частности, sqlway все конвертировал через временные таблицы, но такие функции нельзя использовать в sql.
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258476
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ToshkinНО! Запрос вернул только первые 504 записи из многих тысяч.
Можно как-то убрать это ограничение для массива или нужно искать другое решение?
create type (array) по-умолчанию размерность 2 147 483 647.
Это не ограничение вашего редактора - показывать только первые N записей?
У вас что,
select count(1) from table(test())
возвращает 504, а запрос, которым вы наполняете массив - гораздо больше?
...
Рейтинг: 0 / 0
Вопрос по хранимым табличным функциям
    #38258523
Toshkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinToshkinНО! Запрос вернул только первые 504 записи из многих тысяч.
Можно как-то убрать это ограничение для массива или нужно искать другое решение?
create type (array) по-умолчанию размерность 2 147 483 647.
Это не ограничение вашего редактора - показывать только первые N записей?
У вас что,
select count(1) from table(test())
возвращает 504, а запрос, которым вы наполняете массив - гораздо больше?

Сорри, это я в каком-то месте тупанул - в таблице действительно 504 записи.

Благодарю за помощь!!!

Тему можно закрывать.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопрос по хранимым табличным функциям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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