Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Замапить функцию для federated server - можно? / 18 сообщений из 18, страница 1 из 1
27.01.2014, 10:49
    #38538672
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Добрый день!
Может я туплю, но не могу понять - можно ли замапить функцию на подмапленном сервере для DB2?
Процедуры нашел, таблицы нашёл, даже Nickname есть, а вот функции что то не нашел в интерфейсе.
Картинку прикрепляю.
P.S. DB2 9.7 под windows, подмапленные федеративные серверы тоже db2.
СПАСИБО за ответы!
...
Рейтинг: 0 / 0
27.01.2014, 10:58
    #38538687
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Картинку забыл:
...
Рейтинг: 0 / 0
27.01.2014, 14:06
    #38538984
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoed,

CREATE FUNCTION (template)
CREATE FUNCTION MAPPING

Но ей богу, если такое делать, то надо понимать возможные последствия.
Невинно выглядящая конструкция (например, слепленная через год/другой пришедшим вслед разработчиком) с вызовом этой ф-ии на достаточно большом result set'е породит дёрганье этой удалённой ф-ии на каждую строчу. Использование в предикате в where на многомиллионной таблицы может вообще невзначай породить полный table scan с опять таки серией отдельных коммуникаций на каждую исходную строку.
...
Рейтинг: 0 / 0
27.01.2014, 14:11
    #38538994
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
CawaSPb,
Result Set возвращает не более 10 строк, просто серваки разные, но за ответ и заботу спасибо
...
Рейтинг: 0 / 0
27.01.2014, 14:27
    #38539024
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Радость была преждевременной, куда ни копни поглубже в DB2, везде засады!!!
Хотел замапить табличную функцию и...

Create function mapping to table or row functions: A create function mapping to remote functions that returns a table or a row is not supported in a federated database.

Разрабочикам DB2 антиреспект!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
27.01.2014, 15:27
    #38539150
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoed,

В чём проблема, возвращай XML (отмечу, что это именно бинарная структура, а не текстовое представление, которое надо парсить), а на своей стороне оберни удалённый вызов табличной ф-ей.

То, что разработчики DB2 не сделали инструмент для уж слишком лёгкого "стреляния себе в ногу" - и слава богу.
...
Рейтинг: 0 / 0
27.01.2014, 16:13
    #38539264
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
CawaSPbmedoed,

В чём проблема, возвращай XML (отмечу, что это именно бинарная структура, а не текстовое представление, которое надо парсить), а на своей стороне оберни удалённый вызов табличной ф-ей.

То, что разработчики DB2 не сделали инструмент для уж слишком лёгкого "стреляния себе в ногу" - и слава богу.

Правильно, берите пример с Марка, если есть какое то ограничение в DB2, то это не потому что ядро кривое или менеджеры тупые или ещё чего, но это значит, что программист DB2 хочет, чего то неестественное!!!

P.S. у меня возвращается всегда одна строка, поэтому я сделаю функцию, которая будет возвращать один столбец(число) и её замаплю.
Но вообщем DB2 УГ! Имхо!!!!!
...
Рейтинг: 0 / 0
18.04.2014, 17:22
    #38619075
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Подниму вопрос и обращусь к знатокам!
А если сделать процедуру через DYNAMIC RESULT SETS 1 возвращающую курсор, в ней вызывать табличную функцию (это все на одной базе).
Можно потом будет на другой базе через федеративную связь такую процедуру вызывать и получать данные из нее.
Марк, не уважите ответом?
...
Рейтинг: 0 / 0
18.04.2014, 18:21
    #38619153
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoedА если сделать процедуру через DYNAMIC RESULT SETS 1 возвращающую курсор, в ней вызывать табличную функцию (это все на одной базе).
Можно потом будет на другой базе через федеративную связь такую процедуру вызывать и получать данные из нее.Да, можно.
...
Рейтинг: 0 / 0
21.04.2014, 11:40
    #38620217
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Марк, спасибо!
А как мне потом результат такой процедуры в темповую таблицу запихнуть на основной базе?
Попробовал так, не работает:

declare global temporary table SESSION.TEMP_REVEN (REVENUE_MATH decimal(28,14), REVENUE DECIMAL (28,14))
with replace on commit preserve rows not logged;

insert into SESSION.TEMP_REVEN(REVENUE_MATH, REVENUE)
from table(call DAT3.TEST_MAP (13399)); -- процедура курсор возвращает

select * from SESSION.TEMP_REVEN;
...
Рейтинг: 0 / 0
21.04.2014, 15:12
    #38620544
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoed,

- Объявить DAT3.TEST_MAP как READS SQL DATA
- в вызывающей процедуре обработать result set и вставить записи во временную таблицу как-то так:
пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
  DECLARE SQLCODE INT;
  DECLARE l_REVENUE_MATH decimal(28,14);
  DECLARE l_REVENUE decimal(28,14);
  DECLARE L1 RESULT_SET_LOCATOR VARYING;
...
declare global temporary table SESSION.TEMP_REVEN (REVENUE_MATH decimal(28,14), REVENUE DECIMAL (28,14))
with replace on commit preserve rows not logged;
...
  call DAT3.TEST_MAP (13399);
  ASSOCIATE LOCATOR (L1) WITH PROCEDURE DAT3.TEST_MAP;
  ALLOCATE C1 CURSOR FOR RESULT SET L1;
  FETCH C1 INTO l_REVENUE_MATH, l_REVENUE;       
  WHILE (SQLCODE!=100) DO
    insert into SESSION.TEMP_REVEN(REVENUE_MATH, REVENUE) values (l_REVENUE_MATH, l_REVENUE);
    FETCH C1 INTO l_REVENUE_MATH, l_REVENUE;       
  END WHILE;
  CLOSE C1;
...

...
Рейтинг: 0 / 0
21.04.2014, 15:44
    #38620586
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Mark Barinstein,
Марк, сделал как вы советовали , написал процедуру:

Код итоговой процедуры:

CREATE OR REPLACE PROCEDURE "WEB"."GET_SAFE_ALL" ( )
begin
DECLARE SQLCODE INT;
DECLARE l_REVENUE_MATH decimal(28,14);
DECLARE l_REVENUE decimal(28,14);
DECLARE L1 RESULT_SET_LOCATOR VARYING;
DECLARE STR_EXEC VARCHAR(32000);

declare C_REZ cursor with return for s1;

declare global temporary table SESSION.TEMP_REVEN (REVENUE_MATH decimal(28,14), REVENUE DECIMAL (28,14))
with replace on commit preserve rows not logged;

call DAT3.TEST_MAP (13399);
ASSOCIATE LOCATOR (L1) WITH PROCEDURE DAT3.TEST_MAP;
ALLOCATE C1 CURSOR FOR RESULT SET L1;
FETCH C1 INTO l_REVENUE_MATH, l_REVENUE;
WHILE (SQLCODE!=100) DO
insert into SESSION.TEMP_REVEN(REVENUE_MATH, REVENUE) values (l_REVENUE_MATH, l_REVENUE);
FETCH C1 INTO l_REVENUE_MATH, l_REVENUE;
END WHILE;
CLOSE C1;

SET STR_EXEC = 'select REVENUE_MATH, REVENUE from SESSION.TEMP_REVEN';
PREPARE s1 FROM STR_EXEC ;
OPEN C_REZ;
end;


Вызываю и возникает ошибка:
Lookup Error - DB2 Database Error: ERROR [25000] [IBM][DB2/NT64] SQL30090N Operation invalid for application execution environment. Reason code = "18".

В чем трабла?
...
Рейтинг: 0 / 0
21.04.2014, 15:56
    #38620601
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoed,

Что выдает на источнике:
Код: sql
1.
2.
3.
select SQL_DATA_ACCESS
from syscat.routines
where routineschema='DAT3' and routinename='TEST_MAP'
...
Рейтинг: 0 / 0
21.04.2014, 16:01
    #38620609
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Mark Barinsteinmedoed,

Что выдает на источнике:
Код: sql
1.
2.
3.
select SQL_DATA_ACCESS
from syscat.routines
where routineschema='DAT3' and routinename='TEST_MAP'


SQL_DATA_ACCESS
M
...
Рейтинг: 0 / 0
21.04.2014, 16:22
    #38620640
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoedMark Barinsteinmedoed,

Что выдает на источнике:
Код: sql
1.
2.
3.
select SQL_DATA_ACCESS
from syscat.routines
where routineschema='DAT3' and routinename='TEST_MAP'


SQL_DATA_ACCESS
M
Я же написал, что надо:
- Объявить DAT3.TEST_MAP как READS SQL DATA
Это значит, что надо пересоздать процедуру как-то так:
Код: sql
1.
2.
3.
4.
CREATE OR REPLACE PROCEDURE DAT3.TEST_MAP
DYNAMIC RESULT SETS 1
READS SQL DATA
...

После этого запрос должен возвратить R вместо M.
...
Рейтинг: 0 / 0
21.04.2014, 16:44
    #38620657
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
Mark Barinsteinmedoedпропущено...

SQL_DATA_ACCESS
M
Я же написал, что надо:
- Объявить DAT3.TEST_MAP как READS SQL DATA
Это значит, что надо пересоздать процедуру как-то так:
Код: sql
1.
2.
3.
4.
CREATE OR REPLACE PROCEDURE DAT3.TEST_MAP
DYNAMIC RESULT SETS 1
READS SQL DATA
...

После этого запрос должен возвратить R вместо M.
Марк, да я все правильно сделал. Только это верно для базы источника, а вот для базы потребителя надо походу заново мапить процедуру, чтобы она стала R - сейчас попробую. Не ожидал я просто такой подставы. Отпишусь...
...
Рейтинг: 0 / 0
22.04.2014, 11:34
    #38621251
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoedМарк, да я все правильно сделал. Только это верно для базы источника, а вот для базы потребителя надо походу заново мапить процедуру, чтобы она стала R - сейчас попробую. Не ожидал я просто такой подставы. Отпишусь...
Марк, спасибо все получилось, не так красиво как хотелось бы, но сработало!
...
Рейтинг: 0 / 0
22.04.2014, 19:08
    #38622092
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замапить функцию для federated server - можно?
medoed,

Если интересно, то можно и без временных таблиц.

Как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TYPE DAT3.TEST_MAP_T    AS ROW (REVENUE_MATH decimal(28,14), REVENUE decimal(28,14))/
CREATE TYPE DAT3.TEST_MAP_T_A AS DAT3.TEST_MAP_T ARRAY[]/

CREATE OR REPLACE FUNCTION "WEB"."GET_SAFE_ALL" ( )
RETURNS DAT3.TEST_MAP_T_A
BEGIN
  DECLARE l_a DAT3.TEST_MAP_T_A;
  DECLARE l_idx INT DEFAULT 1;
  ...
  loop1: LOOP
    FETCH C1 INTO l_a [l_idx];
    if (SQLCODE=100) then leave loop1; end if;
    SET l_idx = l_idx + 1;
  END LOOP loop1;
  CLOSE C1;
  RETURN l_a;
END/

SELECT * FROM UNNEST(WEB.GET_SAFE_ALL())/

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


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