Можно ли создать определяемую пользователем агрегатную функцию для DB2 без права загружать скомпилированные файлы...?

Прежде чем я отправлюсь в поиски, которые в конечном итоге окажутся безнадежными, я хотел бы спросить тех, у кого больше опыта...

Можно ли создать определяемую пользователем агрегатную функцию для DB2 без прав на загрузку скомпилированных файлов?..? Это для DB2 для AS400 в iSeries v7r3m0.

Моей первой мыслью было создать UDAF как обычную функцию SQL с помощью моего SQL-клиента DBeaver 5.2.5. Я уже создавал обычные UDF таким образом, однако я не уверен, что агрегатную функцию можно написать таким образом. Мне еще предстоит найти какие-либо примеры в Интернете, и это один документ IBM не подходит для моей версии.

Если это невозможно сделать в SQL, то следующий вариант — JAVA. Мои навыки там базовые, но достаточные, чтобы изучить эту возможность, но я впервые делаю это в DB2. Насколько я понимаю, основным препятствием может быть то, что функции JAVA для DB2 требуют загрузки скомпилированных файлов на сервер, но у меня нет для этого прав. Если я не ошибаюсь в этом вопросе..?

Моя следующая мысль заключалась в том, можно ли записывать и компилировать функции JAVA на сервере..? Например, могу ли я написать код JAVA в окне скрипта моего клиента SQL, чтобы при запуске скрипта JAVA компилируется сервером, а затем сохраняется на сервере..? Или, возможно, существует клиент разработки JAVA, такой как IBM Data Studio, который точно так же подключается к серверу. ..?

Или что-то..? Любые предложения будут ценны.

Я объясню UDAF, который я хочу создать. Он будет похож на любой встроенный UDAF, такой как SUM(), но он будет основан на символах и его имя будет GetCommonWords. Входными данными будет столбец таблицы типа CHAR(n). Вывод также будет CHAR(n) со строкой слов, которые являются общими для начала всех записей.

Рассмотрим следующие фразы для столбца "FOOD":

  • арахисовое масло
  • арахисовое масло и желе
  • чашка с арахисовым маслом
  • время для желе с арахисовым маслом

Использование будет GetCommonWords(Food), а результатом будут слова, общие для всех: peanut butter.


person spinjector    schedule 05.09.2019    source источник
comment
Один из способов обойти ограничение, на которое правильно указывает @PaulVernon, — использовать относительно новую агрегатную функцию ARRAY_AGG. Это не сработает для решения RPG External Scalar, но будет работать в Java из-за поддержки массивов SQL и, вероятно, будет работать и в чистом SQL. Вы можете сгруппировать, используя ARRAY_AGG, взять этот массив и передать его в качестве параметра вашей UDF. Затем вы можете вернуть скалярный результат. Если вам нужно решение для RPG, вы, вероятно, могли бы сделать что-то подобное с LISTAGG.   -  person Mike    schedule 04.06.2021


Ответы (1)


В Db2 for i нет оператора CREATE FUNCTION (aggregate) даже в текущем выпуске 7.4. https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/db2/rbafzcreatef.htm

Вы должны знать, что Db2 для i, Db2 для z и Db2 (для LUW) по сути являются отдельными продуктами, и, хотя существует определенное количество общего синтаксиса и функций, вам необходимо просмотреть страницы руководства (и веб-статьи и т. д.) для вашего конкретная платформа (и в идеале уровень версии)

person Paul Vernon    schedule 05.09.2019
comment
Спасибо. Это отвечает на ряд вопросов, которые у меня были. Я часто пользуюсь документацией, на самом деле домашняя страница 7.4 — это ссылка на моей панели инструментов, и вчера я провел там пару часов, пытаясь понять это. - person spinjector; 06.09.2019
comment
Для записи Db2 (для LUW) и Db2 Warehouse действительно имеют CREATE FUNCTION (aggregate) ibm.com/support/knowledgecenter/en/SS6NHC/ - person Paul Vernon; 06.09.2019
comment
Ну... мы находимся в своего рода облаке. Это размещенная система DB2. Нашей старой частной системой был i7(?), но я помню, как кто-то сказал Power9, когда мы перешли на облако. Это наша система инвентаризации, заказов и бухгалтерского учета, которой мы делимся со всеми их клиентами, поэтому у меня есть право делать одни вещи, но не другие. Но... та ссылка, которой вы поделились выше...? Самый последний пример кода предназначен для агрегатной функции с LANGUAGE SQL..!! =-D Это первое, что мне удалось найти. Я собираюсь попробовать это просто посмотреть, что произойдет. Может быть, мне повезет, и это сработает. - person spinjector; 06.09.2019
comment
Если вы используете Db2 for i, вам не повезет. Были бы способы добиться того, чего вы хотите в SQL. Например. хранимая процедура может обрабатывать курсор, или вы можете использовать рекурсивный SQL для тех же целей ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/db2/ или вы можете использовать табличную функцию для разделения ваших строк на проиндексированные строки, тогда некоторая нормальная агрегация должна быть в состоянии дать вам результат ( хотя и неэффективно), но ни один из них не был бы таким элегантным, как совокупная UDF, которую вы могли бы использовать в любом запросе. - person Paul Vernon; 06.09.2019
comment
Да, я начинаю что-то готовить в качестве хранимой функции. Глядя на него, размышляя о способах кода сейчас, с помощью cte, if, циклов, регулярных выражений и т. д. - person spinjector; 06.09.2019
comment
Кроме того, изучение различных функций SQL в этой связанной статье помогает с идеями. - person spinjector; 06.09.2019