Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов табличной функции из UDF / 7 сообщений из 7, страница 1 из 1
26.05.2006, 12:52
    #33753949
ValPot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
Столкнулся с проблемой при вызове табличной функции из UDF. Аналог в IB, Qracle и MS SQL работает. Таких вызовов у меня тысячи в портабельном приложении. Как конвертировать максимально близко (по тексту) в DB2. Из объяснения DB2 мне проблема не ясна.


create function t2( id_session integer, VALUE_ID integer )
returns table ( CNT integer )
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN ATOMIC
return select 1 from sysibm.sysdummy1 ;
END ^

DB20000I Команда SQL выполнена успешно.


create function t3 ( id_session integer, VALUE_ID integer )
returns table ( CNT integer )
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN ATOMIC

DECLARE w_CNT integer;
for l_1 AS select CNT from table( t2( id_session, t3.VALUE_ID )) as T_t2
DO
SET w_CNT = l_1.CNT;
insert into TF_t3 values ( id_session, w_CNT );
end for;
return select CNT from TF_t3 where id_session=id_session;
END ^


DB21034E Данная команда обрабатывалась как оператор SQL, поскольку она не
является допустимой командой процессора командной строки. При обработке SQL
было получено сообщение:
SQL20267N Функции "DB2ADMIN.T2" (с уникальным именем "SQL060526121959800"),
изменяющая данные SQLЮ вызвана в недопустимом контексте. Код причины = "2".
LINE NUMBER=9. SQLSTATE=429BL

SQL20267N Функции "DB2ADMIN.T2" (с уникальным именем "SQL060526121959800"), изменяющая данные SQLЮ вызвана в недопустимом контексте. Код причины = "2 ".

Объяснение:

Функция "<имя-функции>" (с
уникальным именем "<уникальное-имя>")
определена со свойством MODIFIES SQL DATA.
Функции с таким свойством можно
использовать только как последнюю
ссылку на таблицу в операторе SELECT,
общем табличном выражении или
операторе RETURN, который является
подвыборкой, оператором SELECT INTO или
полной выборкой строк в операторе
SET. Кроме того, каждый аргумент
табличной функции должен
соответствовать ссылке на таблицу
в том же условии FROM, в котором
используется эта табличная функция,
а каждой ссылке на таблицу должен
соответствовать некоторый
аргумент этой табличной функции.
Аргумент соответствует ссылке на
таблицу, когда он является столбцом
этой ссылки на таблицу.

Код причины:

1. После табличной функции есть
ссылки на таблицы.

2. Табличная функция не
используется во внешней
подвыборке.

3. Перед табличной функцией есть
ссылка на таблицу, не указанная в
аргументах функции.

4. Табличная функция используется в
теле определения производной
таблицы.

5. Табличная функция используется в
fullselect в контексте XQuery.

6. На эту табличную функцию
ссылается оператор OUTER JOIN, или она
встроена в другие явные
объединения (с использованием
скобок в условии объединенной
таблицы).

Оператор невозможно обработать.

Действия пользователя:



1. Перепишите запрос, чтобы
табличная функция была последней
ссылкой на таблицу в условии FROM.

2. Переместите табличную функцию во
внешнюю подвыборку.

3. Удалите ссылку на таблицу, не
заданную в аргументах табличной
функции, или включите в табличную
функцию аргумент,
соответствующий ссылке на
таблицу.

4. Удалите табличную функцию из
тела определения производной
таблицы.

5. Удалите табличную функцию из
fullselect в контексте XQuery.

6. Удалите операцию OUTER JOIN или не
помещайте табличную функцию во
вложенное явное объединение.

Для кодов причины 1, 2 и 3 можно
переписать запрос, используя общее
табличное выражение, чтобы
изолировать вызов табличной
функции.


Например:
SELECT c1 FROM
(SELECT c1 FROM t1, t2, TABLE(tf1(t1.c1) AS tf), t3) AS x, t4
можно переписать как:
WITH cte1 AS (SELECT c1 FROM t1, TABLE(tf1(t1.c1) AS tf),
AS (SELECT c1 FROM t2, cte1, t3)
SELECT c1 FROM x, t4;


sqlcode : -20267

sqlstate : 429BL
...
Рейтинг: 0 / 0
26.05.2006, 13:00
    #33753990
nkulikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
Поставь как окончание оператора @
и запускай скрипт как
db2 -td@ -vf script.db2

db2 clp не понимает что у тебя ; означает конце оператора в процедуре, а не конец процедуры
...
Рейтинг: 0 / 0
26.05.2006, 13:07
    #33754034
ValPot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
Концом процедуры у меня объявлено ^ Редактор команд это понимает. Я сотню функций уже конвертировал.
...
Рейтинг: 0 / 0
26.05.2006, 13:32
    #33754169
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
ValPot
Дело тут вот в чем.
Оно не хочет видеть во 2-й функции обращение к 1-ой нигде, кроме return, т.к. 1-я определена как modifies sql data.
Выход:
1.
Определить 1-ю, как reads sql data
2.
Если 1 - не возможно, не обращаться во 2-й к 1-й, кроме return.
3.
Если первые 2 - не возможно, используйте процедуру.
...
Рейтинг: 0 / 0
26.05.2006, 13:49
    #33754250
ValPot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
Все 3 варианта не подходят. Первые два из-за явной вырожденности. Третий из-за распространненой практики в приложении обращения к табличной функции из SQL запроса как собственно таблице. Я пока стою перед необходимостью изучение С либо Java, надеясь там не встретить такой проблемы. Но не хочется так окольно, да и нет времени.
...
Рейтинг: 0 / 0
26.05.2006, 13:54
    #33754274
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
Я о том, что если охота отдавать пользователю табличную функцию, то использовать call внутри нее.
...
Рейтинг: 0 / 0
26.05.2006, 14:19
    #33754371
ValPot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов табличной функции из UDF
Спасибо, буду пробовать до упора данный путь. От С и Жавы можно отойти. Но вылезет нехилая проблема потдержки идентичного состояния тыщи функций в двух архитектурно несхожих образах. Других предложений не видно?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вызов табличной функции из UDF / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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