Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
Столкнулся с проблемой при вызове табличной функции из 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 12:52 |
|
||
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
Поставь как окончание оператора @ и запускай скрипт как db2 -td@ -vf script.db2 db2 clp не понимает что у тебя ; означает конце оператора в процедуре, а не конец процедуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:00 |
|
||
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
Концом процедуры у меня объявлено ^ Редактор команд это понимает. Я сотню функций уже конвертировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:07 |
|
||
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
ValPot Дело тут вот в чем. Оно не хочет видеть во 2-й функции обращение к 1-ой нигде, кроме return, т.к. 1-я определена как modifies sql data. Выход: 1. Определить 1-ю, как reads sql data 2. Если 1 - не возможно, не обращаться во 2-й к 1-й, кроме return. 3. Если первые 2 - не возможно, используйте процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:32 |
|
||
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
Все 3 варианта не подходят. Первые два из-за явной вырожденности. Третий из-за распространненой практики в приложении обращения к табличной функции из SQL запроса как собственно таблице. Я пока стою перед необходимостью изучение С либо Java, надеясь там не встретить такой проблемы. Но не хочется так окольно, да и нет времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:49 |
|
||
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
Я о том, что если охота отдавать пользователю табличную функцию, то использовать call внутри нее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:54 |
|
||
|
Вызов табличной функции из UDF
|
|||
|---|---|---|---|
|
#18+
Спасибо, буду пробовать до упора данный путь. От С и Жавы можно отойти. Но вылезет нехилая проблема потдержки идентичного состояния тыщи функций в двух архитектурно несхожих образах. Других предложений не видно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 14:19 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=33753949&tid=1605316]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 356ms |

| 0 / 0 |
