Os seguintes devem ser adicionados no final da seção"Aplicativos Mistos Multi-Threaded":
Esta é uma nova seção para esse capítulo.
Existem duas áreas principais de suporte para Aplicativos Unicode do DB2 CLI:
A seguir há uma lista de funções ODBC API que suportam as versões Unicode (W) e ANSI (A) (o nome da função terá um W para Unicode):
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 SQLDrivers SQLGetStmtAttr SQLStatistics SQLError SQLNativeSQL SQLTablePrivileges SQLExecDirect SQLPrepare SQLTables
As funções Unicode que sempre retornam ou usam argumentos de comprimento de cadeia são passadas como contagem de caracteres. Para as funções que retornam a informação do tamanho para os dados do servidor, a exibição do tamanho e precisão são descritas no número de caracteres. Quando o comprimento (tamanho de transferência dos dados) pode referir-se a um dado de cadeia ou sem cadeia, o comprimento é descrito em comprimentos de octeto. Por exemplo, SQLGetInfoW ainda usa o comprimento como contagem de bytes, mas SQLExecDirectW usará contagem de caracteres. A CLI retornará os conjuntos de resultados em Unicode ou ANSI, dependendo da vinculação do aplicativo. Se um aplicativo vincular-se ao SQL_C_CHAR, o driver converterá os dados SQL_WCHAR para SQL_CHAR. O gerenciador de driver mapeia SQL_C_WCHAR para SQL_C_CHAR para drivers ANSI, mas não faz nenhum mapeamento para drivers Unicode.
Existem dois novos tipos de dados CLI ou ODBC definidos, SQL_C_WCHAR e SQL_WCHAR. SQL_C_WCHAR indica que o buffer C contém dados UCS-2. SQL_WCHAR indica que uma coluna ou marcador de parâmetro específico contém dados Unicode. Para DB2 Unicode Servers, as colunas gráficas serão descritas como SQL_WCHAR. A conversão será permitida entre SQL_C_WCHAR and SQL_CHAR, SQL_VARCHAR, SQL_LONGVARCHAR e SQL_CLOB, bem como entre os tipos de dados gráficos.
Tabela 10. Conversões de Dados Suportadas
Tipo de Dados
|
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 S |
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 (Não-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 (Não-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 (Não-Unicode) |
X |
X |
|
|
|
|
|
|
|
|
|
|
D |
|
| |||
VARGRAPHIC (Unicode) |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
D |
|
|
|
X |
|
Antes dos aplicativos Unicode serem suportados, os aplicativos que eram escritos para trabalhar com dados de caracteres de byte único podiam trabalhar com dados gráficos de byte duplo através de uma série de palavras-chave do arquivo cli ini, como GRAPHIC=1,2 ou 3, Patch2=7. Essa alternativa apresentava os dados gráficos como dados de caracteres e também afetavam o comprimento relatado dos dados.
Essas palavras-chave não não mais necessárias para aplicativos Unicode, e não devem ser utilizadas por causa do risco de efeitos colaterais potenciais. Se você não souber se um aplicativo específico é um aplicativo Unicode, sugerimos que tente sem quaisquer palavras-chaves que afetem a manipulação de dados gráficos.
Em bancos de dados não-unicode, os dados nas colunas LONG VARGRAPHIC e LONG VARCHAR não podem ser comparados. Os dados no GRAPHIC/VARGRAPHIC e as colunas CHAR/VARCHAR podem ser apenas comparadas ou atribuídas para cada um, utilizando as funções explícitas cast desde que a página de código implícita seja suportada. Isto inclui os literais GRAPHIC/VARGRAPHIC e CHAR/VARCHAR onde o literal GRAPHIC/VARGRAPHIC é diferente do literal CHAR/VARCHAR por um prefixo G.
Para os bancos de dados Unicode, a conversão entre os literais GRAPHIC/VARGRAPHIC e CHAR/VARCHAR não são requeridos. Um prefixo G, também será requerido no início do literal GRAPHIC/VARGRAPHIC. Contanto que pelo menos um dos argumentos seja um literal, as conversões implícitas ocorrerão. Isso permite que literais com ou sem o prefixo G sejam utilizados em instruções que usam SQLPrepareW() ou SQLExecDirect().Os literais para LONG VARGRAPHICs já possuem um prefixo G.
Para obter mais informações, consulte a publicação "Conversão entre Tipos de Dados" no "Capítulo 3. Elementos de Linguagem" da publicação SQL Reference.
As três palavras-chave foram incluídas para evitar que qualquer suplemento extra seja conectado aos aplicativos Unicode para um banco de dados.
Com o suporte Unicode ativado, e quando chamada por um aplicativo Unicode, a CLI tentará conectar-se ao banco de dados utilizando a melhor página de códigos possível do cliente para assegurar que não haja perda de dados desnecessária por causa da conversão de página de códigos. Isso pode aumentar o tempo de conexão quando as páginas de códigos são trocadas ou pode causar conversões de páginas de códigos no cliente que não ocorriam antes da inclusão desse suporte.
A definição desta palavra-chave para True fará com que todos os dados Unicode sejam convertidos, primeiro, para a página de códigos local do aplicativo, antes dos dados serem enviados para o servidor. Isso pode causar a perda dos dados que não possam ser representados na página de códigos local.
Aplicativos não-Unicode sempre conectam-se ao banco de dados utilizando a página de códigos local do aplicativo ou a definição de ambiente DB2Codepage. Por padrão, a CLI assegurará que os aplicativos Unicode sejam conectados aos bancos de dados Unicode utilizando as páginas de códigos UTF-8 e UCS-2 e sejam conectados aos bancos dados não-Unicode utilizando a página de códigos do banco de dados. Isso assegura que não haja perda de dados desnecessária por causa da conversão da página de códigos.
Esta palavra-chave permite que o usuário especifique a página de códigos do banco de dados ao conectar-se a um banco de dados não-Unicode, para evitar sobrecarga extra na conexão.
Especifique um valor 1 para provocar SQLDriverConnect() retornar ao valor correto da cadeia de conexão de saída, assim o valor poderá ser utilizado no futuro para chamar SQLDriverConnect().
Esta palavra-chave é equivalente para ConnectCodepage=1208 e é incluída apenas por conveniência. Defina esta palavra-chave para evitar conexões suplementares extra quando for conectar o DB2 para OS/390 Versão 7 ou superior. Não existe a necessidade de definir esta palavra-chave para os banco de dados do DB2 para Windows, DB2 para Unix ou DB2 para OS/2, desde que não exista solicitação de uma processamento extra.
A informação a seguir corrige o valor padrão para a palavra-chave de configuração DISABLEMULTITHREAD na subseção "Instalação e Configuração":
A seguinte informação deve ser incluída na seção "Cursores deslocáveis":
O cliente UDB para as plataformas Unix, Windows e OS/2 suporta cursores deslocáveis atualizáveis no lado do servidor ao executar em bancos de dados OS/390 Versão 7. Para acessar um cursor deslocável do OS/390 em um ambiente em três camadas, o cliente e o gateway devem estar executando o DB2 UDB Versão 7.1, FixPak 3 ou posterior.
Existem duas interfaces de ativação de aplicativos que podem acessar cursores deslocáveis: ODBC e JDBC. A interface JDBC pode acessar somente cursores deslocáveis estáticos, enquanto a interface ODBC pode acessar somente cursores deslocáveis estáticos e guiados por teclas no lado do servidor.
A tabela abaixo lista os atributos padrão para cursores do OS/390 Versão 7
no ODBC.
Tabela 11. Atributos padrão para cursores do OS/390 no ODBC
Tipo de cursor | Sensibilidade do cursor | Cursor atualizável | Concorrência do cursor | Cursor deslocável |
---|---|---|---|---|
somente avançoa | não especificado | não atualizável | concorrência somente leitura | não deslocável |
estático | insensível | não atualizável | concorrência somente leitura | deslocável |
guiado por conjunto de teclas | sensível | atualizável | concorrência de valores | deslocável |
|
Todas as orientações de busca ODBC são suportadas através das interfaces SQLFetchScroll ou SQLExtendedFetch.
Um cursor guiado por conjunto de teclas é atualizável. O driver CLI anexa a cláusula FOR UPDATE na consulta, exceto quando a consulta é emitida como SELECT ... FOR READ ONLY, ou se a cláusula FOR UPDATE já existir. O cursor guiado por conjunto de teclas implementado no DB2 para OS/390 é um cursor de concorrência de valores. O cursor de concorrência de valores resulta em bloqueio otimista, nos quais os bloqueios não são retidos até que seja tentada uma atualização ou exclusão. Quando for tentada uma atualização ou exclusão, o servidor do banco de dados compara os valores anteriores do aplicativo recuperado com os valores atuais da tabela fundamental. Se os valores corresponderem, a atualização ou exclusão ocorre. Se não corresponderem, a operação falha. Caso ocorra uma falha, o aplicativo deve consultar os valores novamente e reemitir a atualização ou a exclusão, se ainda for aplicável.
O aplicativo pode atualizar o cursor guiado por teclas de suas formas:
Como o suporte ao cursor deslocável é novo, alguns aplicativos ODBC que
trabalhavam com releases anteriores do UDB para OS/390 ou UDB para Unix,
Windows, e OS/2 podem encontrar mudanças no comportamento ou no
desempenho. Isso ocorre porque antes do suporte aos cursores
deslocáveis, os aplicativos que solicitavam um cursor deslocável recebiam um
cursor somente de avanço. Para restaurar o comportamento anterior do
aplicativo, antes do suporte ao cursor deslocável, defina as seguintes
palavras-chave de configuração no arquivo db2cli.ini:
Definição da palavra-chave de configuração | Descrição |
---|---|
PATCH2=6 | Retorna uma mensagem indicando que os cursores deslocáveis (guiados por conjunto de teclas e estáticos) não são suportados. O CLI automaticamente rebaixa qualquer pedido de um cursor deslocável para um cursor somente de avanço. |
DisableKeysetCursor=1 | Desativa os cursores deslocáveis guiados por teclas no lado do servidor e no lado do cliente. Pode ser utilizado para forçar o driver do CLI a fornecer ao aplicativo um cursor estático quando o cursor guiado por teclas for solicitado. |
UseServerKeysetCursor=0 | Desativa o cursor guiado por teclas no lado do servidor para aplicativos que utilizam a biblioteca do cursor guiado por teclas no lado do cliente para simular um cursor guiado por teclas. Utilize essa opção somente quando ocorrerem problemas com o cursor guiado por teclas no lado do servidor, já que o cursor no lado do cliente resulta em muita sobra e geralmente tem desempenho mais baixo que o cursor no lado do servidor. |
A seguinte nota está faltando na publicação:
Qualquer instrução SQL que pode ser preparada dinamicamente, diferentemente de uma consulta, que pode ser executada como uma instrução dentro de uma instrução composta. Nota: Dentro do SQL Composto Atômico, instruções savepoint, savepoint de liberação e rollback para savepoint SQL são também desabilitadas. Do contrário, o SQL Composto Atômico é desabilitado no savepoint.
A seguir uma limitação não documentada nos procedimentos armazenados CLI:
Se estiver fazendo chamadas aos procedimentos armazenados CLI múltiplos, o aplicativo fecha os cursores abertos de um procedimento armazenado antes de chamar o próximo procedimento armazenado. Mais especificamente, o primeiro conjunto de cursores abertos devem ser fechados antes do próximo procedimento armazenado tentar abrir um cursor.
O item a seguir suplementa as informações na publicação:
O driver CLI/ODBC normalmente irá fazer a vinculação automática dos pacotes da CLI na primeira vez que um aplicativo CLI/ODBC executar a SQL no banco de dados, contanto que o usuário tenha o privilégio ou a autorização adequada. A vinculação automática dos pacotes da CLI não pode ser executada de dentro de um procedimento armazenado e, portanto, não ocorrerá se a primeira coisa que um aplicativo fizer for chamar um procedimento armazenado da CLI. Antes de executar um aplicativo da CLI que chama um procedimento armazenado da CLI em um novo banco de dados do DB2, você deve conectar os pacotes da CLI uma vez com este comando:
db2 bind <BNDPATH>/@db2cli.lst blocking all
db2bind "%DB2PATH%\bnd\@db2cli.lst" blocking
A abordagem recomendada é sempre conectar estes pacotes ao mesmo tempo em que o banco de dados é criado para evitar a vinculação automática no run-time. A vinculação automática poderá falhar se o usuário não tiver privilégio ou se outro aplicativo tentar fazer a vinculação automática ao mesmo tempo.