O SQLJ permite incorporar instruções SQL em programas Java. SQLJ é um padrão ANSI desenvolvido por uma associação de provedores líderes de software de bancos de dados e de servidores de aplicativos que inclui a IBM Corporation, Microsoft Corporation, Sun Microsystems e Oracle.
O conversor SQLJ converte um arquivo de origem SQLJ em um arquivo de origem Java padrão mais um perfil serializado SQLJ que encapsula informações sobre SQL estática na origem SQLJ. O conversor converte cláusulas SQLJ em instruções Java padrão, substituindo as instruções SQL incorporadas por chamadas para a biblioteca de tempo de execução SQLJ. Um script de customização SQLJ liga o perfil SQLJ ao banco de dados, produzindo um ou mais pacotes de banco de dados. O arquivo Java é compilado e executado (com os pacotes) no banco de dados. O ambiente de tempo de execução SQLJ consiste em uma biblioteca de tempo de execução SQLJ implementada em Java puro. A biblioteca de tempo de execução SQLJ chama o driver JDBC para o banco de dados de destino, como o DB2.
Você pode utilizar SQLJ no ambiente de trabalho para criar aplicativos para execução com qualquer banco de dados que suporte SQLJ (por exemplo, DB2 ou Oracle). O recurso de customização interno funciona apenas com o DB2.
O ambiente de trabalho possui os seguintes recursos SQLJ:
Embora o SQLJ e o JDBC forneçam aplicativos Java com o recurso para acessar bancos de dados relacionais, existem várias diferenças entre eles:
Em geral, a SQL dinâmica é mais flexível do que a SQL estática, porque ela não requer a criação antecipada de instruções SQL. A SQL estática é mais eficiente, porque o banco de dados faz uma grande parte do trabalho requerido para executar as instruções SQL antes do tempo de execução.
A SQL dinâmica permite consultar e atualizar tabelas quando, por exemplo, você não sabe o número e tipos das colunas até o tempo de execução. Utilizando SQL dinâmica em JDBC, um programa Java pode criar instruções SQL no tempo de execução.
Com a SQL dinâmica, o acesso ao banco de dados e a autorização são determinados no tempo de execução. O usuário do aplicativo deve ter todos os privilégios do banco de dados requeridos e o banco de dados deve determinar a melhor maneira de acessar os dados requeridos no tempo de execução. No entanto, com a SQL estática, o acesso e autorização são determinados no tempo de customização e de ligação. Os privilégios do usuário que desempenha o processo de ligação determinam o que o aplicativo pode fazer. O banco de dados determina a melhor maneira de acessar dados durante o tempo de customização e de ligação, o que aprimora o desempenho de tempo de execução.
Muitos aplicativos não precisam criar dinamicamente instruções SQL, porque os metadados do banco de dados (como nomes de tabelas e de colunas) não são alterados no tempo de execução. Tais aplicativos podem utilizar SQL estática, o que fornece melhor desempenho do que a SQL dinâmica.
Além de obter melhor desempenho utilizando a SQL estática, o SQLJ tem as seguintes vantagens sobre o JDBC:
O JDBC pode fazer uma coisa que o SQLJ não pode: executar instruções SQL dinâmicas. No entanto, se um aplicativo precisar utilizar SQL dinâmica, será possível incluir algum código JDBC em seu programa com cláusulas SQLJ.
As cláusulas SQLJ estão incorporadas no código Java. Cada cláusula é precedida pelo símbolo #sql. A cláusula SQLJ a seguir é um exemplo de uma instrução SELECT com uma variável Java na cláusula WHERE:
#sql [ctx] cursor1 = {SELECT EMP_ACT.EMPNO FROM EMP_ACT WHERE EMP_ACT.PROJNO = :strProjNo};
O suporte ao DB2 SQLJ é baseado no padrão ANSI SQLJ. Os seguintes tipos de construções SQL podem aparecer em programas SQLJ: