|В конец раздела "Multi-Threaded Mixed Applications" (Создание многопоточных |программ) надо добавить:
Дальше приведен новый раздел для этой главы.
Существуют две основных области поддержки для прикладных программ Unicode CLI DB2:
В следующих разделах приводится дополнительная информация для обеих этих областях. Чтобы программа считалась прикладной программой Unicode, перед выполнением соединения он должна задать для атрибута соединения SQL_ATTR_ANSI_APP значение SQL_AA_FALSE. При этом CLI будет использовать Unicode как предпочтительный метод для связи с этой базой данных.
У функций API ODBC есть суффиксы, указывающие формат их строчных аргументов: функции с именами, оканчивающимися на W, принимают аргументы в формате Unicode; в именах функций, принимающих аргументы ANSI, суффиксы не используются.
SQLBrowseConnect SQLForeignKeys SQLPrimaryKeys SQLColAttribute SQLGetConnectAttr SQLProcedureColumns SQLColAttributes SQLGetConnectOption SQLProcedures SQLColumnPrivileges SQLGetCursorName SQLSetConnectAttr SQLColumns SQLGetDescField SQLSetConnectOption SQLConnect SQLGetDescRec SQLSetCursorName SQLDataSources SQLGetDiagField SQLSetDescField SQLDescribeCol SQLGetDiagRec SQLSetStmtAttr SQLDriverConnect SQLGetInfo SQLSpecialColumns SQLGetStmtAttr SQLStatistics SQLError SQLNativeSQL SQLTablePrivileges SQLExecDirect SQLPrepare SQLTables
Функции Unicode с аргументами длин, которые всегда означают длины строк, интерпретируют эти аргументы как количество символов. Функции, возвращающие информацию о длине для данных сервера, также описывают размер и точность вывода на экран как число символов. Когда длина (размер передаваемых данных) может относиться и к строчным, и к другим данным, эта длина интерпретируется как число байтов. Например, для SQLGetInfoW длина - это число байтов, а для SQLExecDirectW - число символов. CLI будет возвращать данные из наборов результатов либо в Unicode, либо в ANSI, в зависимости от связывания прикладной программы. Если прикладная программа связывается с SQL_C_CHAR, драйвер будет преобразовывать данные SQL_WCHAR в SQL_CHAR. Менеджер драйверов ODBC, если он используется, отображает SQL_C_WCHAR в SQL_C_CHAR для драйверов ANSI, но не выполняет отображения для драйверов Unicode.
|Для работы с базами данных Unicode добавлены дополнительные типы |данных, определяемые ODBC и CLI. Эти типы дополняют набор уже |существующих типов C и SQL. Новый тип C, SQL_C_WCHAR, указывает, что |буфер C содержит данные UCS-2 в формате с собственным порядком байтов. |Новые типы SQL, SQL_WCHAR, SQL_WVARCHAR и SQL_WLONGVARCHAR, указывают, что |столбец или маркер параметра содержит данные Unicode. Для баз данных |Unicode DB2 графические столбцы будут описываться при помощи этих новых |типов.
Табл. 11. Поддерживаемые преобразования данных
Тип данных SQL |
S Q L _ C _ C H A R |
S Q L _ C _ W C H A R |
S Q L _ C _ L O N G |
S Q L _ C _ S H O R T |
S Q L _ C _ T I N Y I N T |
S Q L _ C _ F L O A T |
S Q L _ C _ D O U B L E |
S Q L _ C _ T Y P E _ D A T E |
S Q L _ C _ T Y P E _ T I M E |
S Q L _ C _ T Y P E _ T I M E S T A M P |
S Q L _ C _ B I N A R Y |
S Q L _ C _ B I T |
S Q L _ C _ D B C H A R |
S Q L _ C _ C L O B _ L O C A T O R |
S Q L _ C _ B L O B _ L O C A T O R |
S Q L _ C _ D B C L O B _ L O C A T O R |
S Q L _ C _ B I G I N T |
S Q L _ C _ N U M E R I C |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
BLOB |
X |
X |
|
|
|
|
|
|
|
|
D |
|
|
|
X | |||
CHAR |
D |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
X |
X | |
CLOB |
D |
X |
|
|
|
|
|
|
|
|
X |
|
|
X |
| |||
DATE |
X |
X |
|
|
|
|
|
D |
|
X |
|
|
|
|
| |||
DBCLOB |
|
X |
|
|
|
|
|
|
|
|
X |
|
D |
|
|
X | ||
DECIMAL |
D |
X |
X |
X |
X |
X |
X |
|
|
|
X |
X |
|
|
|
X |
X | |
DOUBLE |
X |
X |
X |
X |
X |
X |
D |
|
|
|
|
X |
|
|
|
X |
X | |
FLOAT |
X |
X |
X |
X |
X |
X |
D |
|
|
|
|
X |
|
|
|
X |
X | |
GRAPHIC (Не Unicode) |
X |
X |
|
|
|
|
|
|
|
|
|
|
D |
|
| |||
GRAPHIC (Unicode) |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
D |
|
|
|
X |
|
INTEGER |
X |
X |
D |
X |
X |
X |
X |
|
|
|
|
X |
|
|
|
X |
X | |
LONG VARCHAR |
D |
X |
|
|
|
|
|
|
|
|
X |
|
|
|
| |||
LONG VARGRAPHIC (Не Unicode) |
X |
X |
|
|
|
|
|
|
|
|
X |
|
D |
|
| |||
LONG VARGRAPHIC (Unicode) |
X |
X |
|
|
|
|
|
|
|
|
X |
|
D |
|
|
|
|
|
NUMERIC |
D |
X |
X |
X |
X |
X |
X |
|
|
|
|
X |
|
|
|
X | ||
REAL |
X |
X |
X |
X |
X |
D |
X |
|
|
|
|
X |
|
|
|
X | ||
SMALLINT |
X |
X |
X |
D |
X |
X |
X |
|
|
|
|
X |
|
|
|
X |
X | |
BIGINT |
X |
X |
X |
X |
X |
X |
X |
|
|
|
X |
X |
|
|
|
D |
X | |
TIME |
X |
X |
|
|
|
|
|
|
D |
X |
|
|
|
|
| |||
TIMESTAMP |
X |
X |
|
|
|
|
|
X |
X |
D |
|
|
|
|
| |||
VARCHAR |
D |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
X |
X | |
VARGRAPHIC (Не Unicode) |
X |
X |
|
|
|
|
|
|
|
|
|
|
D |
|
| |||
VARGRAPHIC (Unicode) |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
D |
|
|
|
X |
|
До того, как стали поддерживаться прикладные программы Unicode, программы, написанные для работы с однобайтными символьными данными, можно было заставить работать с двухбайтными графическими данными при помощи нескольких последовательных ключевых слов файлов cli ini, таких как GRAPHIC=1,2 или 3, Patch2=7. Такой подход представляет графические данные как символьные и оказывает влияние на сообщаемую длину данных.
|Для прикладных программ Unicode такие ключевые слова теперь не |нужны, и не должны использоваться из-за потенциального риска побочных |эффектов. Если достоверно не известно, является ли конкретная |прикладная программа программой Unicode, советуем попробовать обойтись без |ключевых слов, влияющих на обработку графических данных.
В базах данных не Unicode нельзя сравнивать данные в столбцах LONG VARGRAPHIC и LONG VARCHAR. Столбцы GRAPHIC/VARGRAPHIC и CHAR/VARCHAR можно только сравнивать или назначать друг другу, явным образом используя функции преобразования типов, поскольку неявное преобразование кодовых страниц не поддерживается как таковое. Это относится к литералам GRAPHIC/VARGRAPHIC и CHAR/VARCHAR, когда литерал GRAPHIC/VARGRAPHIC отличается от литерала CHAR/VARCHAR при помощи префикса G.
В базах данных Unicode не требуется преобразование между литералами GRAPHIC/VARGRAPHIC и CHAR/VARCHAR. Кроме того, в них перед литералом GRAPHIC/VARGRAPHIC не требуется префикс G. Если, по крайней мере, один из аргументов является литералом, происходят неявные преобразования. Это позволяет применять литералы с префиксом G или без него в операторах, использующих либо SQLPrepareW(), либо SQLExecDirect(). При этом литералы для LONG VARGRAPHIC могут сохранять префикс G.
Дополнительную информацию смотрите в разделе "Casting Between Data Types" (Преобразование типов данных) Главы 3 "Language Elements" (Элементы языка) справочника SQL Reference.
С целью устранения дополнительных издержек при связи прикладных программ Unicode с базой данных были добавлены следующие три ключевых слова.
Если сначала разрешить поддержку Unicode, а затем вызвать прикладную программу Unicode, CLI попробует связаться с базой данных и использованием кодовой страницы клиента, лучше всех обеспечивающей отсутствие дополнительных потерь данных, связанных с преобразованием кодовых страниц. Это может увеличить время соединения за счет изменения кодовых страниц, а также вызвать преобразование кодовых страниц на клиенте, которого не было до добавления этой поддержки.
Задание значения True (1) для этого ключевого слова приведет к преобразованию всех данных Unicode в локальную кодовую страницу прикладной программы перед их отправкой на сервер. Это может привести к потере любых данных, которые нельзя представить в локальной кодовой странице.
Прикладные программы не Unicode всегда связываются с базой данных, используя локальную страницу прикладной программы или установку среды кодовой страницы DB2. По умолчанию CLI будет обеспечивать связь прикладных программ Unicode с базами данных Unicode с использованием кодовых страниц UTF-8 и UCS-2. По умолчанию для соединения с базами данных не Unicode используется кодовая страница баз данных, если в качестве сервера баз данных используется DB2 for Windows, DB2 for Unix или DB2 for OS/2. Это предупреждает потерю данных из-за ненужного преобразования кодовых страниц.
Это ключевое слово позволяет пользователю указывать кодовую страницу базы данных при связывании с базой данных не Unicode, чтобы при этом соединении не было ненужных дополнительных затрат.
Задание значения 1 побуждает SQLDriverConnect() возвращать правильное значение в строке вывода соединения, чтобы это значение можно было использовать при последующих вызовах SQLDriverConnect().
Это ключевое слово эквивалентно ConnectCodepage=1208 и добавлено только для удобства. Установите это ключевое слово для предотвращения избыточных расходов на связь с DB2 for OS/390 Версии 7 или более поздней. Нет необходимости устанавливать это ключевое слово для баз данных DB2 for Windows, DB2 for Unix или DB2 for OS/2, поскольку при этом не требуется дополнительная обработка.
|Необходимо исправить значение по умолчанию для ключевого слова конфигурации |DISABLEMULTITHREAD в подразделе "Installation and Configuration" (Установка и |конфигурирование) : |
В раздел "Scrollable Cursors" (Указатели с возможностью прокрутки) надо добавить следующую информацию:
Клиент UDB для платформ Unix, Windows и OS/2 при применении к базе данных OS/390 Версии 7 поддерживает указатели с возможностью изменения и прокрутки на стороне сервера. Для обращения к указателю OS/390 с возможностью прокрутки в трехуровневой среде на клиенте и на шлюзе должны работать с DB2 UDB Версии 7.1, FixPak 3 или новее.
Существует два программных интерфейса программ, обеспечивающих доступ к указателям с возможностью прокрутки: ODBC и JDBC. Интерфейс JDBC позволяет обращаться только к статическим указателям с прокруткой; интерфейс ODBC позволяет обращаться как к статическим, так и к управляемым клавиатурой указателям с прокруткой на стороне сервера.
В следующей таблице приведены значения по умолчанию атрибутов указателей
OS/390 Версии 7 в ODBC.
Табл. 12. Атрибуты по умолчанию для указателей OS/390 в ODBC
Тип указателя | Чувствительность указателя | Возможность изменения указателя | Одновременность указателя | Возможность прокрутки указателя |
---|---|---|---|---|
только-впередa | не задается | без возможности изменения | одновременность только для чтения | без возможности прокрутки |
статический | нечувствительный | без возможности изменения | одновременность только для чтения | с возможностью прокрутки |
управляемый | чувствительный | с возможностью изменения | одновременность значений | с возможностью прокрутки |
|
Все направления выборки ODBC поддерживаются с помощью интерфейсов SQLFetchScroll или SQLExtendedFetch.
Управляемый указатель - это указатель с возможностью изменения. Драйвер CLI добавляет условие FOR UPDATE к запросу, кроме случаев, когда запрос введен как запрос SELECT ... FOR READ ONLY или условие FOR UPDATE уже есть. Реализованный в DB2 для OS/390 управляемый указатель - это указатель одновременности значений. Указатель одновременности значений выражается в оптимистичной блокировке, то есть блокировка не производится, пока не будет предпринята попытка произвести изменение или удаление. При попытке произвести изменение или удаление сервер базы данных сравнивает предыдущие значения, извлеченные программой, с текущими значениями в основной таблице. Если эти значения совпадают - изменение или удаление успешно выполняется. Если значения не совпадают - операция завершается неудачно. Если происходит ошибка, программа должна опять запросить значения и, если нужно, повторить операцию изменения или удаления.
Программа может изменять управляемый указатель двумя способами:
Так как поддержка указателей с возможностью прокрутки появилась недавно, у
некоторых прикладных программ ODBC, работавших с предыдущими версиями UDB для
OS/390 или UDB для Unix, Windows, и OS/2 может измениться поведение или
производительность. Это происходит из-за того, что до появления
поддержки указателей с прокруткой, программы, требовавшие такой указатель,
получали указатель только-вперед. Чтобы восстановить поведение
программы до появления поддержки указателей с прокруткой, задайте следующие
ключевые слова конфигурации в файле db2cli.ini:
Задание ключевого слова конфигурации | Описание |
---|---|
PATCH2=6 | Возвращает сообщение, что указатели с возможностью прокрутки (как управляемые, так и статические) не поддерживаются. CLI автоматически заменяет требование указателя с прокруткой на требование указателя только-вперед. |
DisableKeysetCursor=1 | Запрещает управляемые указатели с прокруткой с обеих сторон - сервера и клиента. Можно использовать, чтобы драйвер CLI предоставлял программе статический указатель, когда затребован управляемый указатель. |
UseServerKeysetCursor=0 | Запрещает управляемые указатели на стороне сервера для программ, использующих библиотеку управляемых указателей клиентской стороны, чтобы симулировать управляемый указатель. Используйте эту возможность, только если возникли проблемы с управляемым указателем на стороне сервера, так как указатель на стороне клиента приводит к значительным издержкам и обычно имеет худшую производительность, чем указатель на стороне сервера. |
В этой книге пропущен следующий комментарий:
Все операторы SQL, которые могут быть подготовлены динамически и не являются запросами, могут выполняться как операторы внутри составного оператора. Примечание: Внутри составного оператора Atomic Compound SQL не разрешены также операторы SQL savepoint, release savepoint и rollback to savepoint. И наоборот, оператор Atomic Compound SQL нельзя использовать в точке сохранения.
|Пользователям, которые хотят строить, отлаживать и запускать хранимые |процедуры SQL, надо предоставить следующие привилегии: |
|Пользователям, которые хотят строить, отлаживать и запускать хранимые |процедуры Java, надо предоставить следующие привилегии: |
|Чтобы создать таблицу DB2DBG.ROUTINE_DEBUG, введите команду:
|db2 -tf sqllib/misc/db2debug.ddl
|Дополнительную информацию об отладке хранимых процедур Java смотрите в |руководстве Application Development Guide.
Недокументированное ограничение на хранимые процедуры CLI:
Выполняя вызовы нескольких хранимых процедур CLI, прикладная программа должна закрыть открытые указатели, полученные от одной хранимой процедуры, перед вызовом другой хранимой процедуры. Это значит, что первый набор открытых указателей должен быть закрыт прежде, чем следующая хранимая процедура попытается открыть указатель.
Следующая информация дополняет приведенную в книге:
Драйвер CLI/ODBC в норме будет автоматически связывать пакеты CLI при первом выполнении прикладной программой CLI/ODBC SQL для базы данных при условии, что у пользователя есть надлежащие привилегия или авторизация. Автоматическое связывание пакетов CLI не может быть выполнено из хранимой процедуры и поэтому не произойдет, если самым первым действием прикладной программы будет вызов хранимой процедуры CLI. Перед запуском прикладной программы CLI, вызывающей хранимую процедуру CLI для новой базы данных DB2, необходимо один раз связать пакеты CLI при помощи следующей команды:
db2 bind <BNDPATH>/@db2cli.lst blocking all
db2bind "%DB2PATH%\bnd\@db2cli.lst" blocking
Во избежание автоматического связывания во время выполнения рекомендуется всегда связывать эти пакеты во время создания базы данных. Автоматическое связывание может закончиться неудачно, если у пользователя нет привилегии или если в это же самое время пытается автоматически связаться другая программа.