DB2

Особенности использования DB2 версии 8

Вот и пришло время переходить на новую версию DB2, которая под номером 8 =)

Казалось бы, взяли, обновились и спокойненько работаем дальше? А вот нет =)

В этой версии появились ограничения, которые не позволили осуществить этот самый простой переход на новую версию.

В программах, написанных во времена, когда использовался прародитель нынешней, восьмой версии DB2, активно использовались выражения вида

attribute1 || attribute2 

и

attribute1 ^= attribute2

Вот эти простые выражения конкатенации и сравнения перестали поддерживатся новой версией. Пришлось поменять гору программ, чтобы первое выражение превратилось в

attribute1 CONCAT attribute2

а второе в

attribute1 <> attribute2

Вот кто, спрашивается, просил раньше использовать рудиментые операторы DB2? Никто =) Вот и пришлось менять =)

Рекомендации по работе с DB2

За время работы накопилось некоторое количество рекомендаций, с которыми я хочу сейчас с Вами поделиться:
- Используйте DB2 views вместо прямой работы с таблицами.
- Не используйте SELECT * в программах, вычитываейте только необходимые поля.
- Избегайте использования dinamic SQL если это возможно
- Не прячьте исполняемый код в includes. Код должен присутствовать только в программных модулях.
- Используйте DB2 includes, которые были сгенерированы при помощи страндартных средств DB2
- Переменные, которые іспользуются до доступа к DB2 должны иметь такую же длину и тип, как и соответствующие поля DB2 таблиц.
- Избегайте использования JOIN DB2 tables в программах. Исключение - batch программы, запускаемые заданием.
- Никогда не соеденяйте более двух таблиц в программах. Исключение - batch программы, запускаемые заданием.
- Доступ к таблицам следует производить, используя индексы.

Загрузка заданием CTMS таблиц, использующих DB2'шный CTMS user-exit

До начала использования CTMS user-exit type 3, которые стали обнавлять соответствующие записи в DB2 таблицах, загрузка данных в CTMS таблицы через задание не представляла собой проблему. Подготорил файлик, запустил задание и все - таблица настроена.

Но время не стоит на месте и в целях повышения производительности было принято решение создавать DB2 таблицы для часnоиспользуемых CTMS таблиц и в программах осуществлять доступ именно к DB2. CТMSный фронтэнд использовать только как средство для настройки, а обновление данных возложить на CTMS user-exit (третий тип - это тот самый, который вызывается уже после обновления/удаления/втсавки записи в CTMS).

После этих изменений, задание, которое раньше замечательно использовалось для загрузки данных начало валиться с user abend 3042. Описание было бестолковых и мы уже начали подумывать о том, что такой способ загрузке в принципе нельзя использовать.

Вычитка одной строки в запросе DB2 с указанием порядка

Не знаю, один ли я такой неуч, но, как оказалось, при вычитке одной строки в DB2'ом запросе можно указывать порядок - точно так же как и в случаем использования DB2 курсора.

Итак, ограничение по количеству записей устанавливается при помощи выражения:

FETCH FIRST 1 ROW ONLY

В данном случае вычитывается только первая строка из результирующего массива.

Для того, чтобы уменьшить время выполнения запроса и не блокировать таблицы можно добавить еще и:

WITH UR

где UR uncommitted read.

А перед указанным выражением можно использовать стандартный ORDER BY для указания порядка вычитки.

Для проформы приведу итоговый SQL запрос:

SELECT *
  FROM OWNER.TABLE
WHERE
  <CONDITION>
ORDER BY 
  <FIELD> <DIRECTION>
FETCH FIRST 1 ROW ONLY WITH UR

Чтение DB2 таблиц из REXX

Сегодня я хочу рассказать Вам о том, как можно организовать работу с DB2, используя язык REXX.

Для выполнения SQL команд нужно использовать функцию DSNREXX. Пример использования:

/**********************************************************************/
/* Connect to DB2 system                                              */
/**********************************************************************/
ConnectDB2:
  ADDRESS DSNREXX 
  "CONNECT" db2sys
RETURN

Команда DSNREXX должна быть доступна для работы - это можно обеспечить так:

"SUBCOM DSNREXX"
IF RC THEN
   S_RC = RXSUBCOM('ADD','DSNREXX','DSNREXX')

Общая логика REXX программы, обращающейся к DB2, следующая:
1. Подключаемся к DB2 подсистеме
2. Выполняем DB2 команды
3. Отключаемся от DB2 подсистеме

Банально, не правда ли? =)

Итак, сам текст REXX программы, которой в качестве аргумента передается имя DB2 подсистемы:

/* REXX */
trace 'o'
Parse Upper Arg db2sys