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 ORDER BY 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