Para Desenvolvedores

Versão para impressãoEnviar para amigoVersão PDF

Esta página é dedicada aos desenvolvedores que utilizam Informix.
Caso não encontre aqui a informação que procura, entre em contato ou utilize o fórum em português do IIUG.
Para manter-se informado dos novos artigos, assine o Boletim.
Dica: Fique de olho em Bootcamps realizado pela IBM para seus clientes, nele você poderá conhecer experts da IBM em Informix além de outros desenvolvedores para tirar suas dúvidas.

  1. Kits de desenvolvimento
  2. Conectando com o Informix
    1. Connection Strings
    2. Getting Started
    3. Redbook - Developer's Handbook
  3. SQL
    1. SQL Tutorial
    2. Tipo de dados BLOB,BYTE,CLOB,TEXT
    3. Tipo de dados Seriais
    4. Inicializando campos SERIAL
    5. Editor de SQL
    6. Funções gerais, tratamento de strings e datas
    7. Como identificar em qual banco de dados está conectado
    8. Função ROW_NUMBER()
    9. Limitando a quantidade registros retornado por um SELECT
    10. Utilizar FIRST em subquerys
    11. Validar alterações apenas no final da transação
    12. Diferenças entre UNIQUE CONSTRAINT e UNIQUE INDEX
    13. Identificar quantidade de linhas alteradas/retornadas
    14. Utilizar uma procedure no lugar de uma tabela
    15. Utilizar tipos de dados de Conjunto (set,list,multiset)
    16. Concorrência de dados
    17. Trabalhando com datas
    18. Importação/Exportação de dados
    19. Tratando registros duplicados
    20. Tratamento de LOCALE , acentuação, localização regional
    21. Tabelas temporárias
    22. Triggers e Stored Procedures
    23. Stored Procedures no Informix
    24. O que é ROWID?
    25. Capturando SQLs
    26. Compatibilidade com SQL de outros bancos
      1. Tabela DUAL igual do Oracle
      2. Comparação Informix e Oracle
  4. Tunning
    1. Atualização de estatísticas
    2. Analisando um SQL
    3. Comunicação
  5. Segurança
    1. Utilizando CSM
    2. Utilizando SSL
    3. Encriptando dados
  6. Alta Disponibilidade


Kits de desenvolvimento


Para acessar o Informix existem dois kits de desenvolvimento que possuem diferentes drivers e diferentes limitações de recursos:

CSDK - Client Software Development Kit: É o kit "nativo" do Informix, mais completo e compátivel com os novos recursos do banco de dados.

IBM Data Server Client: Este cliente é mais novo onde possui drivers comuns para DB2 e Informix, porém ele ainda tem algumas limitações de recursos mas que estão sendo implementadas a cada versão disponibilizada. Já é claro e divulgado que a IBM pretende manter apenas este Kit no futuro, quando este estiver compatibilizado com o CSDK em termos de recursos suportados.

Ambos kits estão disponiveis para Windows, Unix/Linux e MacOS.

Para mais informações leia o artigo CSDK, IBM Data Server Client e drivers, nele há maiores detalhes sobre os kits de desenvolvimento e refêrencias para outros documentos.

Para realizar o Download dos Clients / Kits de Desenvolvimento, o único lugar disponível é o site da IBM, onde é preciso ter cadastro (é de graça), mas se você tem o pacote de instalação do Banco de dados Informix, junto com ele sempre vem os dois kits(*) para a mesma plataforma do banco.
(*) Na realidade até versões recentes vinha apenas o CSDK, o IBM Data Server era preciso baixar separadamente. Mas agora vem ambos.


Conectando com o Informix



Connection Strings[/h3[
Para ser simples e direto, você pode ver exemplos de Connection Strings aqui:
http://www.connectionstrings.com/informix

[h3]Getting Started


Para o desenvolvedor que está começando a utilizar Informix como seu banco de dados recomendo o e-book Getting Started do Jacques Roy. Nele você irá encontrar exemplos de como se conectar ao Informix para cada linguagem de programação.

Redbook - Developer's Handbook


Agora em Outubro/2010 foi lançado um novo Redbook.
Este redbook é 100% focado em desenvolvimento, como preparar seu ambiente para acessar o Informix e detalhes de como funciona este acesso!
Para baixar, acesse aqui


SQL



SQL Tutorial


Se você quer aprender sobre os recursos básicos de SQL do Informix, leia o manual oficial dele, o SQL Tutorial
Obs.: Este link é para versão 11.50 xC7

Tipo de dados BLOB,BYTE,CLOB,TEXT


Existem grandes diferenças entre estes tipos de dados onde os tipos BYTE e TEXT são padrões antigos do Informix (disponível desde a versão 7), mas é altamente recomendavel trabalhar sempre com BLOB e CLOB por terem menos restrições e serem tipos similares aos utilizados em outros banco de dados.
Para maiores detalhes leia o artigo Diferenças entre Smart Large Object e Simple Large Object.

Tipo de dados Seriais


No Informix existe a muito tempo os tipos de dados seriais, que são os tipos SERIAL, SERIAL8 e BIGSERIAL. Também há o recurso de SEQUENCE.
Para maiores informações leia o artigo Trabalhando com campo SERIAL,SERIAL8,BIGSERIAL.

Inicializando campos SERIAL


Quando precisamos incluir um campo SERIAL em uma tabela que já existe e possui dados, é "necessário" popular a coluna nova, na realidade necessário não é, pode-se deixar tudo com valor igual a zero, mas não faz muito sentindo né?
Para ver como fazer este procedimento de modo rápido e simples, acesse o artigo no BRIUG

Editor de SQL


Na instalação do Informix, todos os utilitários são no padrão CUI (Caracter User Interface, aquela cara de DOS ou terminal Telnet), inclusive seu editor SQL, o dbaccess.
Então pode parecer estranho, principalmente para aqueles que vieram do SqlServer, não existir um ferramenta gráfica (web/windows) especifica que venha com o banco de dados. Bom, estas ferramentas existem mas são distribuidas separadamente da instalação do banco.
Não tenho como dizer o motivo *oficial* pois particulamente nunca questionei ninguém da IBM sobre isso, mas pelo histórico posso dizer que há alguns motivos: é assim devido toda administração do Informix sempre ter sido via linha de comando (até a versão 11), o seu histórico em ambientes Unix, por manter leve sua instalação e porque um DBA Informix que instale/administre o banco dificilmente irá precisar de um ambiente gráfico para isso.
Mas obviamente isso não é regra e para muitos desenvolvedores e alguns DBAs, então o que temos para DBAs é o OAT - OpenAdminTools e para os desenvolvedores temos uma ferramenta "corporativa" da IBM que funciona com o Informix e DB2, o Data Studio, além de excelente ferramentas de terceiros como Server Studio (exclusiva para o Informix), Aquafold, DBvisualizer entre outras, porém estas infelizmente são ferramentas pagas.
O OAT não é focada para desenvolvedores (por enquanto) mas para algumas situações ele já pode "quebrar um galho" com o recurso chamado SqlToolBox que permite a execução de SQLs e analise de sua otimização.

Funções gerais, tratamento de strings e datas


Para referência das maiorias das funções acesse aqui.

Como identificar em qual banco de dados está conectado


Até a versão 11, era um problema identificar o nome do banco de dados que a sessão estava conectada, mas nesta versão (11.50) foi incluído uma nova função para pegar este tipo de dado.
Veja como identificar o nome do BD em qualquer versão do Informix, aqui

Função ROW_NUMBER()


O Informix atualmente ainda carece de algumas funções compatíveis com outros banco de dados, uma delas é a ROW_NUMBER (SqlServer, Oracle).
Acesse o artigo completo aqui

Limitando a quantidade registros retornado por um SELECT


Para isso basta utilizar os comandos FIRST e SKIP.
Estes comandos são similar ao TOP do SqlServer e LIMIT do MySQL .

Utilizar FIRST em subquerys


Este comando limita a quantidade de linhas retornada por um SELECT. Porém ele possui um defeito que ainda não foi implementado pelos desenvolvedores do Informix, que é a sua utilização em sub-querys.
Para ver como contornar este problema leia o artigo Utilizando FIRST em sub-querys.

Validar alterações apenas no final da transação


Pessoalmente considero este recurso útil em certas situações, mas o grande problema é lembrar que ele existe quando precisamos. Veja neste artigo como utiliza-lo.

Diferenças entre UNIQUE CONSTRAINT e UNIQUE INDEX


Existem diferenças sutils mas que pode ter grande impacto em sua apliação em certas situações. Para maiores informações leia o artigo

Identificar quantidade de linhas alteradas/retornadas


Para identificar quantas linhas foram alteradas com um UPDATE/DELETE/INSERT ou quantas linhas um SELECT retornou você deverá utilizar a váriavel SQLCA, que pode ser acessada diretamente quando utilizado ESQL/C ou 4GL. Para outras linguagens deverá utilizar a função dbinfo.
Para maiores detalhes veja a referência sobre o parâmetro sqlca.sqlerrd2 neste artigo Funções gerais: DBINFO ou leia o artigo Quais verficaçoes fazer no SQLCA.

Utilizar uma procedure no lugar de uma tabela


Este recurso é especialmente útil quando se precisa aplicar lógicas de negócio ao retornar um dado e o principal, relacionar estes dados com outras tabelas.
Veja neste artigo como.

Utilizar tipos de dados de Conjunto (set,list,multiset)


Estes tipos de dados podem ser úteis em algumas situações, porém pode gerar dificuldades na implementação do código se o driver e a linguagem ainda não tiver suporte a este tipo de dado.
É preciso uma boa avaliação, testes e regras para identificar o ganho real na utilização deste tipos de dados.
Existem algumas limitações quando utilizado este tipo de dado: Não suporta indices nativamente (mas é possível com indices de funções), funções agregadoras (sum,avg,...), não tem suporte ao update statistics,
Para entender o funcionamento e ver exemplos de como utilizar estes tipos de dados, leia os artigos Diferenças entre SET , LIST e MULTISET e Como manipular dados do tipo collection
Em breve pretendo escrever um artigo demonstrando a utilização de collections como sub-tabelas , denormalizando e tentando identificar quais ganhos podemos ter com isso.

Concorrência de dados


Este é um ponto que muitos desenvolvedores só começam a dar atenção quando os problemas começam a aparecer. Em sistemas corporativos, com muitos usuários este problema são relativamente comuns. Quando a aplicação não está escrita de forma adequada normalmente a consequência é dead locks, sistema "lento" ou até mesmo totalmente travado.
Para maiores informações e recomendações sobre como trabalhar com isso, preventivamente, leia os artigos Entendendo como trablhar com concorrência de dados e Exemplos de comportamento de locks .

Trabalhando com datas


Trabalhar com datas é uma peculiaridade de cada banco, algumas funções são comuns a todos eles, mas outras normalmente são especificas. Trabalhar com data no Informix é algo que considero bem flexivel, nele há um operador que muitos desconhecem mas muito útil, o UNITS.
É preciso prestar muita atenção no locale que se está tabalhando e como você informa uma data no modo literal para ter a conversão correta. Para maiores informações leia os artigos Calculo com datas, Trabalhando com INTERVAL e Funções para tratamento de Data/Hora

Importação/Exportação de dados


Este é um recurso que considero excepcional no Informix, existem muitos meios fáceis de trabalhar, alguns deles com performance imbátivel. Porém para alguns utilitários você precisará da ajuda de seu DBA para configura-lo. Leia os artigos: Exportar/importar dados com UNLOAD/LOAD/DBLOAD, Importando,lendo,exportando dados com External Tables, Exportar/Importar com dbexport/dbimport, Como exportar/importar com HPL, Configuração do HPL...

Tratando registros duplicados


Este recurso de tratamento serve para inclusão de dados novos e não para tabelas que já possuem dados duplicados. Porém nada impede de se utilizar este recurso para mover os dados para um tabela nova removendo os dados duplicados.
Para maiores informações leia o artigo Tratando dados duplicados...

Tratamento de LOCALE , acentuação, localização regional


A definição do LOCALE de um banco de dados deve ser feita sempre antes de criar o banco. Pois uma vez criado não pode ser mais alterado.
Para maiores informações leia os artigos Funcionamento do Global Language Support..., Identificando caracteres utilizados em cada Code-Set, Diferença entre CLIENT_LOCALE, DB_LOCALE e SERVER_LOCALE e Qual a ordem utilizada para as variáveis de Locale

Tabelas temporárias


Tabelas temporárias podem ser a "salvação" ou "vilãs" na performance de seus processos.
No Informix são unicas e exclusivas da sessão que a criou, não é possivel compartilhar ela com outras sessões e se a conexão for perdida ela é automaticamente removida. Mesmo que duas sessões criem tabelas temporárias com o mesmo nome ao mesmo tempo, cada uma será única para sua sessão, cada um com seus dados e sua estrutura.
Como todo grande banco de dados transacional o Informix possui seu LOG de transações e quando se cria tabelas temporárias, por padrão elas possuem suas transações salvas nestes LOGs (isso se o seu DBA não alterou este padrão na configuração da Instancia). Estes LOGs são necessários apenas para transações
Na maioria dos casos as tabelas temporárias não precisam ter controle de transações (efeito do commit/rollback), portanto não precisam ter suas transações salvas no LOG, que consomem recursos desnecessáriamente degradando a performance do banco e aplicação. Mas quem decide isso obviamente é o desenvolvedor pois é ele que está desenhando a lógica de sua utilização, a não ser que o DBA imponha um padrão.
Se este for o caso o desenvolvedore deverá sempre informar que a tabela não deverá ser logada com a opção WITH NO LOG (o que é altamente recomendável em 99.999% dos casos).

Triggers e Stored Procedures


No Informix existe uma limitação na criação de Triggers que é um pouco chata para desenvolvedores, não é possível escrever um código com lógica diretamente nela, é preciso criar uma Stored Procedure e então chamar esta Procedure na Trigger.
Para facilitar a estruturação deste código estas procedures e triggers podem ser integradas, veja como no artigo Integração entre Trigger e Procedure.

Stored Procedures no Informix


A linguagem de Stored Procedures no Informix é chamada de SPL - Stored Procedure Language e é uma linguagem bem facil de trabalhar, principalmente para quem já trabalhou com o Informix 4GL pois são muito parecidas.
No Informix uma rotina também pode ser criada apartir de um código C ou Java.
Para maiores informações leia o artigo

O que é ROWID?


O ROWID é um identificador interno do Informix que é possível referencia-lo em um SELECT/UPDATE/DELETE. Ele identifica fisicamente cada registro. Muitos desenvolvedores criam um péssimo hábito de utiliza-lo em seus programas, mas isso é altamente *não* recomendado. Existem situações que o ROWID pode não existir em uma tabela ou que depois de uma manutenção realizada pelo seu DBA ele deixe de existir. Utilize ele apenas em situações especiais que não serão prolongadas, para resolver problemas pontuais.

Capturando SQLs


As vezes um desenvolvedor precisa capturar os SELECTs executados por sua aplicação para identificar problemas.
No Informix um recurso chamado SQL TRACE, porém talvez seja provável a ajuda de seu DBA para configura-lo pela primeira vez e utiliza-lo.
Para maiores informações leia o artigo Capturar SQLs,DML,DDL.

Compatibilidade com SQL de outros bancos


Tabela DUAL igual do Oracle


Na versão 11.10 foi inlcuido um recurso similar, mas não 100% igual, mas se ele não lhe satisfazer não se preocupe, este problema é muito fácil de solucionar.
Veja neste artigo como.

Comparação Informix e Oracle


Existe um Redbook da IBM sobre migração de Oracle para Informix, nele existe uma tabela de funções Oracle X funções Informix.
Para maiores informações veja no artigo Comparação entre Informix e Oracle.

Tunning



Atualização de estatísticas


A atualização de estatísticas, conhecido pelo comando UPDATE STATISTICS, é algo que o desenvolvedor nunca deveria ter que se importar ou saber que existe. Mas para um desenvolvedor que goste de resolver os problemas de performance em seus SELECTs sem depender de DBAs isso é algo necessário. Em resumo a atualização de estatísticas é um levantamento feito nos dados para que o otimizador de SQL saiba qual melhor "caminho" utilizar para obter o dado (indice, hash-joins, left/right joins, etc).
Para maiores informações leia o artigo O que é o update statistics e para que serve?

Analisando um SQL


No Informix é possível fazer uma analise extremamante detalhada de como o otimizador está executando seu SELECT, em outras palavras, se ele está utilizando X indice, o que está sendo filtrado primeiro, se está criando uma tabela temporária implicita e etc. Tudo isso são informações imprencidiveis se você quer entender e melhorar a performance de seu SELECT.
Para fazer isso é preciso ativar o modo explain com o comando SET EXPLAIN. Existe uma integração deste comando com ferramentas como o Data Studio e Server Studio onde eles exibem de modo gráfico facilitando o entendimento.

Comunicação


A otimização da comunicação, na realidade fica mais a cargo do DBA e o desenvolvedor não deveria se preocupar. Mas isso não é 100% verdade pois dependendo do tipo de otimização que se quer criar ela pode afetar o funcionamento da aplicação e isso vai dependender de como ela foi escrita e de como os componentes utilizados irão se comportar.
Para ilustrar com exemplos práticos de como afeta a performance quando as configurações e código estão funcionando de modo otimizado, leia estes artigos: Testes práticos de performance... e O buffer FET_BUF_SIZE é compartilhado...
Para outras configurações de comunicação, leia o artigo Configurar TIMEOUT de conexões

Segurança


A segurança da conectividade do cliente com o Informix pode ser feita de várias maneiras, utilizando o CSM - Comunication Suport Module ou SSL - Secure Socket Layer . A configuração destes recursos dependem mais do DBA uma vez que na aplicação não é preciso realizar grandes mudanças.
Para os dados existem funções para encripta-los (AES/TDES).

Utilizando CSM


Não tenho nenhum artigo escrito em português de como configura-lo, mas há alguns tutorias da IBM em inglês: Encryption over the wire..., Using the PAM Authentication Method with ESQL/C.

Utilizando SSL


Não tenho nenhum artigo escrito em português de como configura-lo, mas há um tutorial da IBM em inglês muito bom,
Protect your data with Secure Sockets Layer support in Informix Dynamic Server, Part 1: Setting up SSL support in IDS.

Encriptando dados


Para encriptar/desencriptar dados o Informix já fornece funções que lhe permite trabalhar com encriptação a nivel de coluna, linhas ou celulas. Para mais informações veja as referências no artigo Funções gerais e leia o artigo da IBM Column-Level encryption.

Alta Disponibilidade


No Informix podemos configurar ambientes de alta-disponibilidade com balanceamento de carga, para o desenvolvedor isso deve ser praticamente transparente, porém há algumas pequenos tratamentos adicionais que deve ser feito:
- Tratamento de mensagens de erros para quando ocorrer a perda de conexão entre os servidores primário/secundário
- Tratamento de novas mensagens de erros para utilização de campos Smart large Objects nos servidores secundários
- Novas considerações se utilizado Transações distribuidas.