Obtendo data e hora atual no DB2

Para os que estão acostumados com o MySql esse é um problema que seria facilmente resolvido utilizando a função Now(), porem no DB2 essa função não existe.

No DB2 devemos utilizar current timestamp para indicar a data e hora atual (isso mesmo, separado). Exemplo de utilização:

INSERT INTO DB.TABELA
(DATA_ALTER, OWNER_ALTER, NOME, EMAIL)
VALUES
( current timestamp, 'contato@acmcorrea.com.br',
 'Nome da pessoa', 'Email da pessoa')

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: