Instalando e configurando (DB2) o Squirrel SQL no Linux

O Squirrel SQL é uma ótima opção de client SQL, pois além de possuir diversas funcionalidades sua distribuição é livre.  Segue o passo a passo para instalação e configuração do Squirrel SQL no Linux.

Instalação

1. Primeiro acesse o site http://squirrel-sql.sourceforge.net/e clique em Download and Installation.
2. Selecione a opção Install jar of SQuirreL 3.6 for Windows/Linux/others (ou superior)
3. Faça o download do instalador.
4. O instalador é um .jar, uma extensão compilada do Java. Abra uma janela de terminal, vá até o diretório do instalador e digite java -jar squirrel-sql-3.6-standard.jar

Será aberta a seguinte tela de instalação, clique em Next

5. Aqui são algumas informações. Caso queira ler fique a vontade, ou então clique em Next.

6.  Nessa tela ele irá pedir qual a pasta de instalação, no meu caso é a “/home/antonioc/squirrel-sql-3.6″, altere para uma de sua preferência ou deixe a padrão. Clique em Next.

7. Caso a pasta informada não exista, a seguinte mensagem será exibida. Clique em OK para criar a pasta.

8. Agora aparecerá a tela para selecionarmos os pacotes a serem instalados, mantenha o Base e o Standard selecionados e escolha os plugins que deseja instalar (podem ser adicionados depois da instalação também).

9. Aguarde o processo de instalação de clique em Next

10. A primeira opção cria um atalho no menu iniciar do sistema. Caso queira que seja criado um atalho na área de trabalho marque também a segunda opção. Clique em Next.

11. Seu Squirrel SQL esta instalado.

Configuração (DB2)

Iremos configurar o Squirrel SQL para conectar a uma base de dados DB2, para isso e necessário que  haja um client DB2 instalado na maquina.

1. Abra o Squirrel e selecione a opção Drivers.

2.  Localize na lista de Drivers o “IBM DB2 App Driver”,  e dê um duplo clique nele para editar suas configurações. Preencha o formulário com as informações abaixo:
Name: IBM DB2 App Driver
Exemple URL: jdbc:db2:<dbname>
Web Site URL: http://www-306.ibm.com/software/data/db2

Class Name: com.ibm.db2.jcc.DB2Driver

Extra Class Patch:
/opt/IBM/db2/V9.7/java/db2jcc.jar
/opt/IBM/db2/V9.7/java/db2jcc_license_cu.jar
/opt/IBM/db2/V9.7/java/db2jcc_license_cisuz.jar


Utilize o botão Add para adicionar as classes

Após preencher todos os dados, selecione OK. Caso queira utilize o botão Show Loaded Drivers Only para exibir apensa os drivers configurados.

Pronto, o seu Squirrel SQL já esta com o Driver DB2 configurado, agora vamos adicionar uma conexão com um banco de dados.

1. No menu a esquerda clique em Aliases e depois no sinal “+”.

2.  Na tela que abrir insira um nome para a conexão, selecione um Driver, e preencha o usuário e a senha de acesso ao banco.

3. Selecione o botão Properties para configurar algumas variáveis da conexão. Em Driver Properties, habilite a opção “Use driver properties” e depois clique com o botão direito em uma das linhas e selecione Add Property:

Irá abrir uma janela para você preencher as informações:
Property Name: retrieveMessagesFromServerOnGetMessage
Property Value: true
Selecione o botão Add:

Selecione a opção Specify para a nova linha inserida e depois clique em OK
Essa nova linha garante que o DB2 retorno uma mensagem com a descrição do erro encontrado em uma instrução SQL.

4.Selecione o botão Test para verificar se esta funcionando.

Acione o botão Connect para realizar a conexão com o banco de dados.

Será exibida uma mensagem informando que a conexão foi realizada com sucesso.

Pronto sua conexão com o banco de dados foi criada com sucesso! Para criar outras conexões DB2 você pode duplicar essa que você criou e alterar apenas as informações de conexão.

DB2 – Realizando INSERT com o resultado de um SELECT

Essa é uma forma de inserir dados muito útil, que pode simplificar muito seu código.
Vou dar um exemplo:

Imagine que você precisa abrir um registro de RCA (Root cause analysis) para cada desvio de processo. Você já possui um Data Warehouse onde há todos os processos gravados (tanto os finalizados com sucesso quanto os com desvio). Esses RCA’s são armazenados em uma tabela em seu banco de dados.
Dessa forma, utilizando a dica desse post,  você pode criar uma rotina para a partir de alguns dados chave do seu Data Warehouse (mais associações com tabelas auxiliares) realizar a abertura automática de RCA’s para os devidos owners.

Vamos ver qual a sintaxe do SQL:

<strong>INSERT INTO</strong> SCHEMA_X_NAME.TABLE_NAME_INSERT
     (EMPNUMBER, PROJNUMBER, STARTDATE, ENDDATE)
  <strong>SELECT</strong> EMPNO, PROJNO, EMSTDATE, EMENDATE
    <strong>FROM</strong> SCHEMA_Y_NAME.NAME_SELECT

No caso o INSERT seria feito na tabela SCHEMA_X_NAME.TABLE_NAME_INSERT a partir dos dados da tabela SCHEMA_Y_NAME.NAME_SELECT.

O comando é bem simples, eu mesmo já utilizei diversas vezes.
Espero ter ajudado, qualquer dúvida deixem um comentário.
Obrigado.

DB2 – Calcular a diferença entre duas datas

Muitas vezes precisamos calcular a diferença entre duas datas, porem uma simples subtração não resolve o nosso problema. Para tanto devemos utilizar a função TIMESTAMPDIFF do DB2, funcionando da seguinte forma:

&gt;&gt;-TIMESTAMPDIFF--(--expression--,--expression--)--------------&gt;&lt;

No caso o primeiro parâmetro é um número que indica qual será o formato do resultado (dias, minutos, semanas, …), seguindo a seguinte tabela:

1 Fractions of a second
2 Seconds
4 Minutes
8 Hours
16 Days
32 Weeks
64 Months
128 Quarters
256 Years

O segundo parâmetro é onde será adicionada sua expressão, ou seja onde você fará a subtração entre datas:

DATA_HORA_FECHAMENTO - DATA_HORA_ABERTURA

Para finalizar segue um exemplo de como ficaria a consulta SLQ utilizando a função:
SELECT  TIMESTAMPDIFF(4, DATA_HORA_FECHAMENTO - DATA_HORA_ABERTURA)
    FROM YOUR_SCHEMA.YOUR_TABLE
GO

No caso o retorno será a diferença entre a data hora de fechamento e a data hora de abertura, sendo retornado em minutos, já que utilizamos o parâmetro 4.

O DB2 utiliza a seguinte regra para fazer os cálculos:

  • There are 365 days in a year.
  • There are 30 days in a month.
  • There are 24 hours in a day.
  • There are 60 minutes in an hour.
  • There are 60 seconds in a minute.

Espero ter ajudado, qualquer dúvida deixem um comentário.
Obrigado.

Removendo registros duplicados em uma tabela

Muitas vezes nos deparamos com a necessidade de remover registros duplicados em uma determinada tabela do Banco de Dados. No caso que vou compartilhar com vocês comparamos os registros mantendo apenas o registro mais antigo na base.

Considerando

SCHEMA_NAME: Nome do seu Schema no banco de dados;
TABLE_NAME: Nome da tabela onde temos os registros duplicados;
CAMPO_A_TIMESTAMP: Campo (DATE ou TIMESTAMP) que iremos utilizar de parâmetro para verificar qual o registro mais antigo;
CHAVE: Campo que indica o numero do registro duplicado (código do produto, numero do incidente, …);

Temo o seguinte SQL

DELETE
FROM <strong>SCHEMA_NAME</strong>.<strong>TABLE_NAME</strong> A
WHERE
<strong>CAMPO_A_TIMESTAMP</strong> &gt;
(SELECT MIN(<strong>CAMPO_A_TIMESTAMP</strong>)
FROM <strong>SCHEMA_NAME</strong>.<strong>TABLE_NAME</strong> B
WHERE A.<strong>CHAVE</strong> = B.<strong>CHAVE</strong>)

Espero que a dica tenha sido útil, caso tenham alguma dúvida é só deixar um comentário. Obrigado.

Exibir ” ‘ ” (aspas simples) em concatenação no DB2

Esse é um problema que pode levar muitos a loucura, principalmente por outros bancos de dados aceitarem o carácter \ para indicar a inserção de um carácter especial (ex: ‘\”).

Felizmente existe uma solução um tanto quanto simples para esse caso, que seria inserir uma sequencia de 4 aspas simples:

'<strong>'</strong>''

Sendo que a primeira e a quarta aspas se tornam os delimitadores, e uma das duas apas do meio é eliminada. Vamos ver um exemplo:

SELECT ('''' || CODIGO || ' - ' || NOME || '''' || ' : '
|| '''' || NOME || '''' ) AS INFO
FROM DB.TBL_TIMES

Nos retorna:

INFO
---------------------------------------------------
'0 - Unix' : 'Unix'
'3 - Inte' : 'Intel'
'5 - Banco de Dados' : 'Banco de Dados'

Contornando problemas com LIMIT e OFFSET no DB2

Quem esta acostumado a utilizar em suas SQL Queries os comandos LIMIT e OFFSET, vai ter dificuldades na hora de trabalhar com o IBM DB2, pois ele (por padrão) não aceita esses comandos.

LIMIT e OFFSET permitem trazer apenas uma parte das linhas geradas pela consulta, sendo que são muito utilizados para montar scripts de paginação.

SELECT <var>lista_seleção</var>
    FROM <var>expressão_tabela</var>
    [LIMIT { <var>número</var> | ALL }] [OFFSET <var>número</var>]

Quando o limite é fornecido, não mais que esta quantidade de linhas será retornada (mas possivelmente menos, se a consulta produzir menos linhas). LIMIT ALL é o mesmo que omitir a cláusula LIMIT.

OFFSET informa para saltar uma quantidade de linhas antes de começar a retornar as linhas para o cliente. OFFSET 0 é o mesmo que omitir a cláusula OFFSET. Se tanto OFFSET quando LIMIT forem especificados, então são saltadas OFFSET linhas antes de começar a contar as LIMIT linhas que serão retornadas.

Agora que conhecemos os comandos, e o que fazem, vamos para a utilização no IBM DB2, com a solução de contorno:

Para apenas limitar a quantidade de linhas que a consulta irá resultar, podemos utilizar o comando FETCH FIRST n ROWS ONLY.
Exemplo: 

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM DB.EMP
  ORDER BY SALARY DESC
  FETCH FIRST 20 ROWS ONLY;

Nesse exemplo teremos as 20 primeiras linhas que a query retornar (limita em apenas 20 linhas o resultado). Isso soluciona o problema da utilização do LIMIT n.

Agora para o caso de utilizar LIMIT 10, 2 ou LIMIT 2 OFFSET 10, que retornaria apenas 10 linhas começando no registro 3 (pulando os dois primeiros), teremos que fazer um workaround, utilizando a função ROW_NUMBER() e o BETWEEN (na clausura WHERE).

SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY NOME ASC) AS ROWNUMBER,
NAME, LASTNAME
FROM DB.TABLE_NAME
) AS TMP
WHERE ROWNUMBER BETWEEN 2 AND 10

Dessa forma conseguiremos simular o mesmo resultado que seria obtido pelo LIMIT e OFFSET.

Links úteis:

Concatenação de valores no Banco de Dados

Muitas vezes nos deparamos com situações onde precisamos concatenar valores em nossas SQL queries, e hoje irei ensinar como realizar essa atividade nos DB’s MySQL e IBM DB2.

Possuímos duas formas de realizar essa atividade, utilizando a função CONCAT() (presente em ambos os DB’s) e através do carácter “pipe”.

CONCAT();
No MySQL a função CONCAT() retorna a string resultante da concatenação dos argumentos, sendo que o DB aceita um ou mais argumentos. Se todos os argumentos são strings não-binários, o resultado é uma string não binários. Se os argumentos incluirem quaisquer strings binárias, o resultado é uma string binária. Um argumento numérico é convertido na sua forma equivalente binário string;
Exemplo:

mysql&gt; SELECT CONCAT('My', 'S', 'QL');
-&gt; 'MySQL'

Já no IBM DB2 a função retorna a concatenação de dois argumentos de cadeia sendo que os dois argumentos devem ser de tipos compatíveis (tabela de compatibilidade). O resultado da função é uma string cujo comprimento é igual à soma dos comprimentos dos dois argumentos.
Exemplo: 

CONCAT(string-expression-1,string-expression-2)

DB2&gt; SELECT CONCAT('IBM ','DB2') FROM TBL_TESTE;
-&gt;'IBM DB2'

Carácter “pipe” ||

Em ambos os DB’s você utilizar uma sequencia de dois caracteres | (pipe) para obter a concatenação dos valores:

DB&gt;SELECT 'Artigo' ||' - '||'primeiro '|| db_campo || ' fim';
-&gt; 'Artigo - primeiro <strong>valor do db_campo</strong> fim'

Com o ‘||’ é possível concatenar diversos valores de uma vez só (mesmo no IBM DB2).

Links úteis: